比较十进制忽略精度(如果为零)

时间:2019-06-04 10:09:01

标签: c# sql-server entity-framework decimal

在我的代码中,我通过使用属性反射来比较当前值和旧值,从而跟踪对象的变化。我的数据库中有一个类型为decimal(5,2)的字段。

因此,当我从前端传递12到数据库时,它被存储为12.00,这很好。但是,如果我尝试再次使用值12保存对象,更新跟踪器会发现它与当前值不同,因此更新跟踪器会说

12 != 12.00

因此它将其记录为更新,实际上不是因为它们是相同的值。

如何检查这些值的等效性?

编辑

从更新跟踪器开始,我的意思是我已经在EntityFramework的TemplateContext中编写了自己的方法SaveChanges,该方法在调用时实际上调用了原生SaveChanges方法,但在此之前,它使用来遍历对象的所有属性反射并跟踪属性的更改,如果有更改,则将其插入到我的一个数据库表中,以向用户显示所有更改以及更改时间的日志。

因此,在该代码中,我正在检查存储在数据库中的旧值和UI提供的新值。

因此,我的C#类中的属性的类型为十进制,因此我实际上没有将int与十进制进行比较,而是使用十进制值来检查十进制值。

因此12也存储在decimal属性中,而12.00也存储在decimal属性中

编辑2

这是跟踪更改的方法

public int SaveChanges(string personnelNo, string fullName, DateTime? now = null)
{
    var modifiedEntities = ChangeTracker.Entries().Where(p => p.State == EntityState.Modified).ToList();
    now = now ?? DateTime.UtcNow;

    foreach (var change in modifiedEntities)
    {
        var entityName = change.Entity.GetType().Name;
        var primaryKey = GetPrimaryKeyValue(change);

        foreach (var prop in change.OriginalValues.PropertyNames.Where(p=> skipUpdatesProperties.Any(s=> s==p) == false))
        {

          // below are the two lines which get original and current value
          // originalValue is coming from the database as 12.00
          // currentValue is coming from UI as 12
          // This is where it fails and says that the values are different 
          // I also tried removing ToString() also and comparing directly that also doesn't work
            var originalValue = change.OriginalValues[prop]?.ToString(); 
            var currentValue = change.CurrentValues[prop]?.ToString();
            if (originalValue != currentValue) //Only create a log if the value changes
            {
                //Create the Change Log
                var ut = new Model.UpdateTracker
                {
                    Id = Guid.NewGuid(),
                    TableName = entityName,
                    TableKey = primaryKey.ToString(),
                    FieldName = prop,
                    OldValue = originalValue,
                    NewValue = currentValue,
                    CreatedOn = now.Value,
                    CreatedBy = personnelNo,
                    CreatedByFullName = fullName
                };
                this.UpdateTrackers.Add(ut);
                this.Entry(ut).State = EntityState.Added;
            }
        }
    }

    return base.SaveChanges();
}

1 个答案:

答案 0 :(得分:3)

检测到实际问题后,也添加为答案:

如果OriginalValues[prop]CurrentValues[prop]的返回值是object,则请注意,即使==!=进行相等性检查,也将使用参考比较。框内的值为decimal。请改用Equals