2017-03-17 7 views
0

設定:asp.net mvc Webアプリケーション、azure sql db、EF codefirst。 dbテーブル(A)内の複数のフィールド(viewModelから来る)の値に単一のレコードの変更を(ユーザが)提出するとき、私のコードは別のテーブル(B)で変更を加えなければなりません。SubmitChanges()前の変更を検出する

表Bの変更は、表Aの特定のフィールドも変更された場合に行う必要があります。

変更が実際に行われる前に、特定のフィールドの値が変更されたかどうかを検出する方法はありますか?

答えて

1

SaveChangesをオーバーライドして、特定のプロパティがあるのAエンティティのために特別に見えます修正:

public override int SaveChanges() 
{ 
    var aEntries = this.ChangeTracker.Entries<A>() 
         .Where(e => e.Property(a => a.SomeProperty).IsModified); 
    foreach (var entry in aEntries) 
    { 
     // apply changes to B 
    } 
    return base.SaveChanges(); 
} 

サイドノート:から

このようなシナリオを扱うのは私の好みのやり方ではありません。 SaveChangesの仕事は、よく、変更を保存することです。誰かが何か他のことをするとは思わないでしょう。コードがそこにあることを忘れても簡単です。メンテナンスやバグ修正の際に他の人がコードを探すのは明らかではありません。

追加されたコードが潜在的に副作用を引き起こすと悪化します。私はSaveChangesのコンテキスト状態を変更することに非常に注意を払います。そして、それはまさに私が "Bへの変更を適用する"と思うことです。私はむしろ重要な箇所でこれらの変更を行うでしょう:Aが変更されたコードです。

1
あなたのDbContextクラスでのSaveChangesをオーバーライドして、エンティティを調べることができ

がChangeTrackerから変更する :あなたのDbContextサブクラスで

public override int SaveChanges() 
{ 
    var changeSet = ChangeTracker.Entries<MyList>(); 

    if (changeSet != null) 
    { 
     // Add checks 
    } 
    return base.SaveChanges(); 
} 
関連する問題