我正在现有的数据库应用程序(SQL服务器)上编写.NET Web应用程序。原始开发人员将资金存储在float
列中,而不是money
或decimal
。我真的想在我的POCO中使用Decimal
(特别是因为我得到它后我会对值进行进一步的操作)。
不幸的是,我无法触及数据库架构。有没有办法在我的POCO中使用Decimal
并告诉EF“没关系,我知道decimal
和float
不相处。我也不喜欢它。只是尽你所能。“
没有特殊配置,我收到此错误:
从物化“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.
答案 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
一次,以减少转换错误的累积。