Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架HasPrecision在保存时未验证_C#_Entity Framework_Validation_Decimal_Entity Framework 6 - Fatal编程技术网

C# 实体框架HasPrecision在保存时未验证

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并保存实

使用实体框架6,代码优先的方法

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)?