6

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

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

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

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

4

2 回答 2

4

您的上下文只会跟踪您的数据是否被修改,而不是如果它不同。

你可以做这样的检查:

  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

于 2013-03-13T23:06:47.497 回答
4

现在看起来情况有所不同(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;
于 2016-04-27T16:45:59.127 回答