1

ef 5を使用して子エンティティの変更を追跡できますか?

例:

ドメインオブジェクト:本(1対多)ページ

var oldBook = context.Books.Include("Pages");
context.Entry(oldBook).CurrentValues.SetValues(updatedBook);

このコードは、updatedBookオブジェクトの単純なプロパティの値で古いbookオブジェクトの単純なプロパティを更新します。

子コレクションを追跡する方法はありますか?(この場合はページ)。または、それを行うためのベストプラクティスはありますか?

4

1 に答える 1

4

あなたの質問は少し曖昧です。

ef 5を使用して子エンティティの変更を追跡できますか?

もちろん、IQueryable.AsNoTracking()またはを使用して変更の追跡を明示的に無効にしない限りMergeOption.NoTracking、に接続されているエンティティの変更を追跡できますDBContext ObjectStateManager

これを実行できる関数があるかどうかを本当に尋ねている場合:

context.Entry(oldBook).CurrentValues.SetValues(updatedBook);

そして、オブジェクトグラフ全体の現在の値(oldbookがルート)をupdatedBookオブジェクトグラフの更新された値に設定します。

ループして、context.Entry(oldPage).CurrentValues.SetValues(updatedPage)更新したい各ページを呼び出す必要があります。

データベースからエンティティをプルして自動変更追跡を使用し、追跡されたエンティティに変更された値を直接設定することはできないという切断されたシナリオにいると思います。そうでない場合は、に接続された単一のオブジェクトグラフを使用できます。 2つのインスタンス(つまり、古い本、更新された本)を操作する代わりにコンテキスト。

すでに切り離された変更済みオブジェクトグラフがある場合は、データベースからエンティティを取得する代わりに、SetValues()変更されたものとしてエンティティをコンテキストにアタッチすることを使用する必要があります。それでも、オブジェクトグラフ内のすべてのエンティティに対して、ループして同じことを行う必要があります。

context.Entry(updatedBook).State = EntityState.Modified;
foreach(var p in updatedBook.Pages) context.Entry(p).State = EntityState.Modified;
context.SaveChanges();
于 2013-02-06T22:31:48.197 に答える