系统发生截断.当使用实体框架5到Oracle 11g/12c时,十进制为Oracle's浮点

本文关键字:Oracle 十进制 12c 浮点 11g 系统 框架 实体 | 更新日期: 2023-09-27 18:14:24

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

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

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

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

系统发生截断.当使用实体框架5到Oracle 11g/12c时,十进制为Oracle's浮点

@Grant在上面评论中提供的链接提供了答案。我在这里复述一下。默认的decimal对应的是Oracle的DECIMAL(18,2)。这就是为什么四舍五入到小数点后两位。为了改变默认行为,必须在Context类的OnModelCreating覆盖中添加一条语句。(在EF6中,您可以一次更改所有decimal字段的约定,如此处所示。)

为特定Decimal字段更改Decimal映射

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //...
    modelBuilder.Entity<MyEntity>().Property(x => x.MyProperty).HasPrecision(18, 5);
    //...
}