使用 Entity Framework 5 到 Oracle 11g/12c 时,Oracle 的浮点数 System.Decimal 发生截断

Truncation Occurs on System.Decimal to Oracle's Float when using Entity Framework 5 to Oracle 11g/12c

我首先使用 Entity Framework 5 代码与 Oracle 11g 或 12c 数据库通信(我已经在两个版本中验证了该问题)。 Oracle 字段是 FLOAT 类型,而我的 POCO 中的字段是 decimal。我使用 decimal 因为我需要我的小数位精确到 5 位。

当我保存我的实体时,数据库中的结果记录总是将值四舍五入到小数点后两位。

我已通过数据库工具 (Toad) 验证该列将支持 5 的精度。由于向后兼容,我无法更改数据库中的数据类型。我发现使用 double 没有同样的问题。但是 double 因给出不精确的数字而臭名昭著,尤其是在执行多项数学运算时。

有谁知道为什么 decimal 值会被截断?我正在使用 Oracle 数据提供程序。

link provided by @Grant in the comments above provided the answer. I will paraphrase here. The default mapping for a decimal value is to an Oracle DECIMAL(18,2). This is why it was rounding to two decimal places. In order to change the default behavior, you have to add a statement in the OnModelCreating override inside the Context class. (In EF6 you can change the convention for all of the decimal fields at once as noted here.)

更改 Decimal 特定 Decimal 字段的映射

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //...

    modelBuilder.Entity<MyEntity>().Property(x => x.MyProperty).HasPrecision(18, 5);

    //...
}