2017-05-30 123 views
1

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

public decimal? Kolhalt { get; set; } 

在OnModelCreating我有

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

在值被指定为Kolhalt数据库(十进制(18,3),空)

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

与SQL Server探查我可以看到,EF指定2位小数的存储值:

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

(输入值是5.123)。

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

是否必须指定小数的位数才能在SaveChanges()中正确使用?

最好的问候, 亨里克

回答

2

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

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

嗨,这节省了我的一天。 TruncateDecimalsToScale = false解决了这个问题。我想我昨天确实尝试了这个,但一定是犯了一些错误。我试图提出你的答案,但我没有足够的声誉来显示。 – Henrik

+0

你能否提供更多关于你如何将它分配给你使用的上下文的细节? – Andrew

+0

请参阅[这里](https://msdn.microsoft.com/en-us/library/jj680699(v = vs.113).aspx)。我只是将它作为上下文的相同文件夹中的一个类添加。 –