出于性能原因,我在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执行DetectChanges
是SaveChanges
的一部分,无论如何。但是检查源代码表明,即使在AutoDetectChangesEnabled
为 false
时也没有执行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
的时刻,这对我来说似乎是可取的。