实体框架是否将赋值与原始值进行比较以确定IsModified标志?

时间:2013-03-13 20:49:04

标签: entity-framework entity-framework-4 updates

如果我加载实体对象然后将其中一个属性分配给之前的相同值,框架是否会检测到更改,或者它会将IsModified标志设置为true?

这就是字段名称的生成代码如下所示:

OnNameChanging(value);
ReportPropertyChanging("Name");
_Name = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Name");
OnNameChanged();

我不知道哪些事件为该字段和整个实体设置了IsModified标志。

2 个答案:

答案 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);
    }

源:https://stackoverflow.com/a/13515869/1339087

答案 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;