2017-06-28 2 views
3

パフォーマンス上の理由から、私はAutoDetectChangesEnabled = falseをDbContextに持っています。エンティティフレームワークでコレクション検出プロパティの変更をオフにする

単純なプロパティと参照プロパティをすべて更新すると問題はありませんが、多対多のコレクションプロパティに問題があり、結合クラスがありません。

これは、コードのコレクションに追加しようと略称される:

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はどんなSaveChangesの一部としてDetectChangesを実行していないと思いました。しかし、ソースコードを調べると、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; 
    } 
} 

代替がなく、AutoDetectChangesEnabled = trueを設定することで、オーバーライドでChangeTracker.DetectChanges();を呼び出すことであろう、 EF自体は、の間にSaveChangesの間に電話をする瞬間を選択します。

関連する問題