使用Entity Framework 6,Code first方法
在HasPrecision
类中使用EntityTypeConfiguration
方法设置属性的精度时,似乎只会影响小数值的截断行为。有没有办法强制实体框架在精度不是指定的情况下抛出错误(如果字符串长度太长则与MaxLength
相同)。
示例:
this.Property(t => t.Amount).HasColumnName("Amount").IsRequired().HasPrecision(19, 2);
将金额设置为5.4567
并保存实体时,保存的值为5.45
我希望在这种情况下出错。
实现它的最佳方式是什么?
答案 0 :(得分:0)
我认为可以采用一种方法来创建验证逻辑
DbContext.ValidateEntity
方法
更多信息here
答案 1 :(得分:0)
简而言之:不,没有这样的方式。这就是非整数在计算机中的工作方式。计算机中的十进制数通常不准确,只能通过舍入来得到。
这就是说,如果你这样做:
Console.WriteLine((0.1 + 0.2).ToString("R"));
输出将为0.30000000000000004
(R
,因此它可以显示double
存储的17位数字,而不是默认显示在ToString()
上的15位数字})。你可以check it here。
如果您实际上是圆形的,那么结果只会得到0.3,但是内部存储不精确,并且它只是0.3的近似值(如果您舍入到任何大量的数字那么近似 - 小于17十进制在这种情况下的位置,你会得到0.3)。
这不是任意的,它是在IEEE 754标准(wikipedia)中定义的。
所以没有办法(除了一些精心挑选的数字)你可以在计算机中存储精确到第n个精度的数字并且它会不断地投掷。
如果你想投掷,你可以验证你的参赛作品,但我想不出这样做的实际情况。
如果您采用验证方式,请注意:
Console.WriteLine((0.1+0.2)==0.3);
返回False
(针对精度问题),因此要小心如何验证您的条目是否已舍入