实体框架修改集合属性,关闭检测更改

时间:2017-06-28 06:10:54

标签: c# entity-framework

出于性能原因,我在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数据库与原来的数据库相同之后,它什么也没做。这是正确的做法吗?

2 个答案:

答案 0 :(得分:4)

呼叫:

context.ChangeTracker.DetectChanges();

或者:

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

答案 1 :(得分:0)

我一直认为EF执行DetectChangesSaveChanges 的一部分,无论是什么。但是检查源代码会发现,DetectChangesAutoDetectChangesEnabled时,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}}的时刻,这似乎是比我好。