【问题标题】:Entity Framework HasPrecision is not validated on save实体框架 HasPrecision 在保存时未验证
【发布时间】:2015-02-20 16:01:44
【问题描述】:

使用 Entity Framework 6,代码优先方法

EntityTypeConfiguration 类中使用HasPrecision 方法设置属性的精度时,它似乎只会影响十进制值的截断行为。有没有办法强制实体框架在精度不符合规定的情况下抛出错误(如果字符串长度太长,则与MaxLength 相同)。

例子:

this.Property(t => t.Amount).HasColumnName("Amount").IsRequired().HasPrecision(19, 2);

将Amount设置为5.4567并保存实体时,保存的值为5.45

我宁愿在这种情况下得到一个错误。

实现它的最佳方法是什么?

【问题讨论】:

    标签: c# entity-framework validation decimal entity-framework-6


    【解决方案1】:

    我认为一种方法是使用 DbContext.ValidateEntity方法

    更多信息here

    【讨论】:

      【解决方案2】:

      简而言之:不,没有这样的方法。这就是非整数在计算机中的工作方式。计算机中的小数一般不准确,只有四舍五入才能准确。

      就是这样,如果你这样做:

      Console.WriteLine((0.1 + 0.2).ToString("R"));
      

      输出将是0.30000000000000004R 可以显示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(用于精度问题),因此请注意您如何验证您的输入是否被舍入

      【讨论】:

      • 量级呢?他们至少应该验证 12345.0 太大而无法放入小数(6,2)?
      猜你喜欢
      • 2010-09-16
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多