0

我正在现有的数据库应用程序(SQL 服务器)之上编写一个 .NET Web 应用程序。最初的开发人员将钱存储在float列中,而不是moneydecimal。我真的很想Decimal在我的 POCO 中使用(特别是因为我将在获得这些值后对它们进行进一步的操作)。

不幸的是,我无法触及数据库架构。有没有办法Decimal在我的 POCO 中仍然使用并告诉 EF “没关系,我知道decimalfloat不相处。我也不喜欢它。尽力而为。”

没有特殊配置,我得到这个错误:

从具体化的“System.Double”类型到“System.Decimal”类型的指定转换无效。

我尝试使用modelBuilder.Entity(Of myPocoType).Property(Function(x) x.MoneyProperty).HasColumnType("float"),但这给了我这个错误:

Schema specified is not valid. Errors:
(195,6) : error 0063: Precision facet isn't allowed for properties of type float.
(195,6) : error 0063: Scale facet isn't allowed for properties of type float.
4

1 回答 1

1

像这样的东西会起作用:

public class MyPocoType
{
    public float FloatProp { get; set; }

    [NotMapped]
    public decimal DecimalProp
    {
        get
        {
            return (decimal)FloatProp;
        }
        set
        {
            FloatProp = (float)value;
        }
    }
}

EF 会忽略这个decimal,但你可以使用它,它会设置底层的float. 如果您希望它做任何特殊的事情,您可以添加自己的逻辑来处理精度损失,并且您可能需要捕获值超出其转换范围的情况(float范围更大,但decimal具有更高的精度)。

这不是一个完美的解决方案,但如果你坚持使用floats 那么它不会变得更好。Afloat本质上有点模糊,所以这会让你在某个地方绊倒。

如果您真的想变得复杂,您可以考虑在内部保留十进制值,然后使用在保存时间发生的各种事件(覆盖中的一些逻辑SaveChanges(),或者可能捕获SavingChanges事件)仅转换为float一次,以减少关于转换错误的累积。

于 2013-08-07T09:57:43.107 回答