如果我加载实体对象然后将其中一个属性分配给之前的相同值,框架是否会检测到更改,或者它会将IsModified标志设置为true?
这就是字段名称的生成代码如下所示:
OnNameChanging(value);
ReportPropertyChanging("Name");
_Name = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Name");
OnNameChanged();
我不知道哪些事件为该字段和整个实体设置了IsModified标志。
答案 0 :(得分:3)
您的上下文仅跟踪您的数据是否被修改,而不是它是否不同。
您可以这样检查:
private void CheckIfDifferent(DbEntityEntry entry)
{
if (entry.State != EntityState.Modified)
return;
if (entry.OriginalValues.PropertyNames.Any(propertyName => !entry.OriginalValues[propertyName].Equals(entry.CurrentValues[propertyName])))
return;
(this.dbContext as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity).ChangeState(EntityState.Unchanged);
}
答案 1 :(得分:3)
现在看来情况有所不同(EF6)。我正在研究这个,看看在设置属性值时是否需要使用if语句来查看“新值”是否不同。我测试了以下内容,并且实体未标记为已修改:
var things = dbContext.Things.AsQueryable();
var thing = things.First();
string name = thing.Name;
thing.Name = name;
var entry = dbContext.Entry(thing);
var state = entry.State;
int count = dbContext.ChangeTracker.Entries().Count(e => e.State == EntityState.Modified);
var modified = entry.Property(x => x.Name).IsModified;