实体框架修改收集属性,以检测更改



出于性能原因,我在dbcontext上具有autodetectchangesenabled = false。

更新简单的属性和参考属性都可以正常工作,但是我在众多且没有加入类的集合属性方面遇到了麻烦。

这是缩写的代码,试图添加到集合中:

var item = context.Set<Item>().FirstOrDefault();    
var category = context.Set<Category>().FirstDefault();
context.Entry(item).Collection(i => i.Categories).CurrentValue.Add(category);

但是,在Savechanges之后,数据库与以前相同。这是这样做的正确方法吗?

呼叫:

context.ChangeTracker.DetectChanges();

或:

context.Entry(item).State = EntityState.Modified;

我一直认为EF执行DetectChangesSaveChanges 的一部分,无论如何。但是检查源代码表明,即使在AutoDetectChangesEnabledfalse时也没有执行DetectChanges

我认为,在您的情况下,您能做的最好的是覆盖SaveChanges,因此它将始终在保存之前检测更改:

public override int SaveChanges()
{
    var detectChanges = this.Configuration.AutoDetectChangesEnabled;
    try
    {
        this.Configuration.AutoDetectChangesEnabled = true;
        return base.SaveChanges();
    }
    finally
    {
        this.Configuration.AutoDetectChangesEnabled = detectChanges;
    }
}

一种替代方法是在覆盖中调用ChangeTracker.DetectChanges();,但是通过设置AutoDetectChangesEnabled = true,EF本身将选择在SaveChanges期间致电DetectChanges的时刻,这对我来说似乎是可取的。

最新更新