出于性能原因,我在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数据库与原来的数据库相同之后,它什么也没做。这是正确的做法吗?
答案 0 :(得分:4)
呼叫:
context.ChangeTracker.DetectChanges();
或者:
context.Entry(item).State = EntityState.Modified;
答案 1 :(得分:0)
我一直认为EF执行DetectChanges
是SaveChanges
的一部分,无论是什么。但是检查源代码会发现,DetectChanges
为AutoDetectChangesEnabled
时,false
即使执行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
,但通过设置DetectChanges
,EF本身会选择在SaveChanges
期间拨打{{1}}的时刻,这似乎是比我好。