如何使ac#decimal匹配EF更改跟踪的SQL十进制?

jwr*_*ail 5 precision entity-framework decimal change-tracking

为避免触及EF中的不变记录,原始和当前实体值匹配很重要.我看到小数的问题,其中EF实体具有SQL表示并且正在与c#decimal进行比较.

这是检测到更改的实体的调试输出.这很清楚地显示了这个问题.即使实体和源数据都是十进制类型,即使它们相等,值也被视为差异.

在此输入图像描述

使用c#decimal时,如何确保原始值和当前值匹配?

也许有一种方法可以在更新之前将c#decimal转换为实体(SQL)十进制?

另一个例子

在此输入图像描述

我希望截断忽略传入精度高于SQL规模的事实

kar*_*ara 3

您可以实现一个代理属性来处理从代码精度到数据库精度的转换:

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)