2017-06-28 43 views
3

由於性能原因,我在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後,該數據庫是相同的,因爲它是。這是做這件事的正確方法嗎?

回答

4

電話:

context.ChangeTracker.DetectChanges(); 

或者:

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

'context.Entry(item).State = EntityState.Modified;'不影響導航屬性,所以不會有幫助。 –

0

我始終認爲,EF執行DetectChangesSaveChanges一部分不管是什麼。但是檢查源代碼顯示,即使在爲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; 
    } 
} 

另一種方法是,但通過設置AutoDetectChangesEnabled = true調用ChangeTracker.DetectChanges();的覆蓋, EF本身會選擇在SaveChanges期間撥打DetectChanges的時刻,這對我來說似乎更可取。

相關問題