【问题标题】:Entity Framework 6 decimal precisionEntity Framework 6 小数精度
【发布时间】:2017-05-30 08:41:54
【问题描述】:

在我的代码优先实体框架 sql 数据库中,我有一个指定为 18,3 的十进制值。 数据库对象:

public decimal? Kolhalt { get; set; }

在 OnModelCreating 我有

     modelBuilder.Entity<Skada>().Property(o => o.Kolhalt).HasPrecision(18, 3);

在数据库中,该值指定为 Kolhalt (decimal(18, 3), null)

如果我直接在数据库中输入一个值,我会得到三位小数,但是当我使用 EntityFramework 插入或更新一个值时,它会被截断为两位小数。

使用 Sql server profiler 我可以看到 EF 为存储的值指定了 2 个小数:

[Kolhalt] = @14 ...  @14 decimal(18,2) ...  @14=5.12

(输入的值为 5.123)。

所以由于某种原因,当我调用 SaveChanges() 时,EF 会截断发送到数据库的值。

我是否必须在其他地方指定小数位数才能在 SaveChanges() 中正确显示?

最好的问候, 亨里克

【问题讨论】:

    标签: entity-framework-6


    【解决方案1】:

    我在一个项目中遇到了类似的问题。奇怪的是,当我将模型从 decimal? 更改为 decimal 时,它开始工作了。我还发现了一个可以添加的配置设置TruncateDecimalsToScale

    public class DbContextConfiguration : DbConfiguration
    {
        public DbContextConfiguration()
        {
            var providerInstance= SqlProviderServices.Instance;
            SqlProviderServices.TruncateDecimalsToScale = false;
            this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
        }
    }
    

    【讨论】:

    • 嗨,这节省了我的时间。 TruncateDecimalsToScale = false 解决了这个问题。我想我昨天确实试过这个,但一定是犯了一些错误。我试图支持你的回答,但我没有足够的声誉来展示它。
    • 您能否详细说明您如何将其分配给您使用的上下文?
    • here。我只是将它作为一个类添加到与上下文相同的文件夹中。
    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2014-02-07
    • 2017-08-05
    • 2012-10-13
    • 2017-04-04
    • 2013-12-16
    • 2013-05-20
    相关资源
    最近更新 更多