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

alp*_*pav 6 entity-framework updates entity-framework-4

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

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

OnNameChanging(value);
ReportPropertyChanging("Name");
_Name = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Name");
OnNameChanged();
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*tor 7

现在看来情况有所不同(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;
Run Code Online (Sandbox Code Playgroud)

针对 EF6 证明这一点的链接

用于证明 EF Core 这一点的链接


Nik*_*kos 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 仅当数据被修改时才意味着值发生了根本变化,甚至回到了原始值:) (2认同)