C# 实体框架HasPrecision在保存时未验证
使用实体框架6,代码优先的方法 在C# 实体框架HasPrecision在保存时未验证,c#,entity-framework,validation,decimal,entity-framework-6,C#,Entity Framework,Validation,Decimal,Entity Framework 6,使用实体框架6,代码优先的方法 在EntityTypeConfiguration类中使用HasPrecision方法设置属性的精度时,它似乎只会影响十进制值的截断行为。如果精度不符合规定(与字符串长度过长时的MaxLength相同),是否有任何方法强制Entity Framework抛出错误 例如: this.Property(t=>t.Amount).HasColumnName(“Amount”).IsRequired().HasPrecision(19,2) 将金额设置为5.4567并保存实
EntityTypeConfiguration
类中使用HasPrecision
方法设置属性的精度时,它似乎只会影响十进制值的截断行为。如果精度不符合规定(与字符串长度过长时的MaxLength
相同),是否有任何方法强制Entity Framework抛出错误
例如:
this.Property(t=>t.Amount).HasColumnName(“Amount”).IsRequired().HasPrecision(19,2)代码>
将金额设置为5.4567
并保存实体时,保存的值为5.45
在这种情况下,我宁愿得到一个错误
实现它的最佳方法是什么?我认为一种方法是使用
DbContext.ValidateEntity
方法
更多信息简而言之:不,没有这样的方法。这就是非整数在计算机中的工作原理。计算机中的十进制数通常不精确,只有通过四舍五入才能精确
如果你这样做:
Console.WriteLine((0.1 + 0.2).ToString("R"));
输出将是0.3000000000004
(那里的R
可以显示double
存储的17位数字,而不是默认情况下在ToString()上显示的15位。你可以
如果实际对其进行四舍五入,结果只能得到0.3,但内部存储并不精确,它只是0.3的近似值(因此,如果四舍五入到任何有效数字量(在本例中,任何小于17个小数点的位置),则可以得到0.3)
这不是任意的,它是在IEEE 754标准()中定义的
所以没有办法(除了一些精心挑选的数字)将精确的四舍五入到第n个精度的数字存储在计算机中,而且它会不断地抛出
如果您想抛出,您可以验证您的条目,但我想不出这样做是可行的
如果您选择验证,请注意:
Console.WriteLine((0.1+0.2)==0.3);
返回False
(对于精度问题),因此要小心如何验证要舍入的条目大小如何?他们至少应该验证12345.0是否太大而无法放入十进制(6,2)?