Entity Framework オブジェクトのすべてのインスタンスを変更せずにオブジェクトを更新するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/7810989

質問

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() 読み取り専用のシナリオ向けに設計されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top