Entity Framework オブジェクトのすべてのインスタンスを変更せずにオブジェクトを更新するにはどうすればよいですか?
-
26-10-2019 - |
質問
Entity Framework 4.1 を使用してデータベース エンティティにアクセスする次のコードがあります。
public string Test()
{
Navigation nav = db.Navigations.FirstOrDefault();
List<Navigation> lNav = db.Navigations.ToList();
foreach (var item in lNav)
{
item.Label += " [Edited]";
}
return nav.Label;
}
これを asp.net mvc で実行すると、次が返されます。
News [Edited]
私はそれが返されることを期待していました:
News
自分のことだと思っていたから foreach
の内容を変更するだけです lNav
. 。代わりに、エンティティ オブジェクトのすべてのインスタンスが変更されるようです。
どうすれば変更できますか lNav
こちらも修正せずに nav
?
解決
試す AsNoTracking()
:
Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();
この方法では、ロードされたエンティティはコンテキストにアタッチされず、最初のエンティティに対して 2 つの異なるインスタンスが作成される必要があります。を使用することで AsNoTracking
観察した動作の原因となるエンティティのキー値とオブジェクト参照の間の ID マッピングを無効にします。(コンテキスト内に指定されたキーを持つエンティティ参照は常に 1 つだけ存在でき、同じキーを持つエンティティを読み込んだ場合、EF は新しいオブジェクトを作成しません。代わりに、コンテキスト内にすでに存在するオブジェクトを返します。)
EF の変更追跡メカニズムを使用してエンティティを更新する場合は、これを使用できないことに注意してください。 AsNoTracking()
読み取り専用のシナリオ向けに設計されています。
所属していません StackOverflow