我可以将decimal属性映射到float db列

时间:2013-08-07 09:47:45

标签: sql-server entity-framework

我正在现有的数据库应用程序(SQL服务器)上编写.NET Web应用程序。原始开发人员将资金存储在float列中,而不是moneydecimal。我真的想在我的POCO中使用Decimal(特别是因为我得到它后我会对值进行进一步的操作)。

不幸的是,我无法触及数据库架构。有没有办法在我的POCO中使用Decimal并告诉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.

1 个答案:

答案 0 :(得分: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具有更高的精度。)

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

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