jwr*_*ail 5 precision entity-framework decimal change-tracking
为避免触及EF中的不变记录,原始和当前实体值匹配很重要.我看到小数的问题,其中EF实体具有SQL表示并且正在与c#decimal进行比较.
这是检测到更改的实体的调试输出.这很清楚地显示了这个问题.即使实体和源数据都是十进制类型,即使它们相等,值也被视为差异.
使用c#decimal时,如何确保原始值和当前值匹配?
也许有一种方法可以在更新之前将c#decimal转换为实体(SQL)十进制?
另一个例子
我希望截断忽略传入精度高于SQL规模的事实
您可以实现一个代理属性来处理从代码精度到数据库精度的转换:
public class MoneyClass
{
[Column("Money")]
public decimal MyDbValue { get; set; } // You existing db-property
[NotMapped]
public decimal MyCodeValue // some property to access within you code
{
get
{
return this.MyDbValue;
}
set
{
decimal newDbValue = decimal.Round(value, 2);
if (this.MyDbValue != newDbValue)
{
Console.WriteLine("Change! Old: {0}, New: {1}, Input: {2}", this.MyDbValue, newDbValue, value);
this.MyDbValue = newDbValue;
}
}
}
}
static void Main(params string[] args)
{
MoneyClass dbObj = new MoneyClass()
{
MyCodeValue = 123.456M
};
Console.WriteLine(dbObj.MyDbValue);
dbObj.MyCodeValue = 123.457M; // won't change anything
Console.WriteLine(dbObj.MyDbValue);
dbObj.MyCodeValue = 123.454M; // will change because of 3rd decimal value 4
Console.WriteLine(dbObj.MyDbValue);
dbObj.MyCodeValue = 123.46M; // will change
Console.WriteLine(dbObj.MyDbValue);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |