在我的代码中,我通过使用属性反射来比较当前值和旧值,从而跟踪对象的变化。我的数据库中有一个类型为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();
}
答案 0 :(得分:3)
检测到实际问题后,也添加为答案:
如果OriginalValues[prop]
和CurrentValues[prop]
的返回值是object
,则请注意,即使==
和!=
进行相等性检查,也将使用参考比较。框内的值为decimal
。请改用Equals
。