5

バックグラウンド

EFでエンティティを更新するのに問題があります。私はこのエラーを受け取り続けます:

「同じキーを持つオブジェクトはすでにObjectStateManagerに存在します。ObjectStateManagerは同じキーを持つ複数のオブジェクトを追跡できません。」

私は、どこかに接続されている別のエンティティが明らかにあることを十分に認識しています。しかし、私は現在それを追跡することはできません。たくさんのコードがあり、私はすでにかなりの時間を費やしています。私が見る限り、私はAsNoTracking()すべてのクエリで拡張メソッドを使用しています。

必要なもの

私の質問はこれです:いつでもObjectStateManagerに実際に何があるかを確認する方法はありますか?デバッグ中にそこにあるアイテムを見ることができれば、これがどこから来ているのかをより迅速に追跡できます。

上記が不可能な場合は、この問題に取り組むための最善の方法についてアドバイスをいただければ幸いです。それは今の干し草の山の中の針のようなものです。

4

4 に答える 4

4

いつでも実際に ObjectStateManager にあるものを確認する方法はありますか? デバッグ中にそこにあるアイテムを見ることができれば、これがどこから来ているのかをより迅速に追跡できます.

Visual Studio デバッガーのクイック ウォッチ機能を使用して、ObjectStateManager の内容を確認することもできます。パスは次のとおりです。

コンテキスト -> ObjectContext -> ObjectStateManager -> 非公開メンバー

于 2013-02-10T22:12:25.917 に答える
1

この質問は役に立ちました:

エンティティがdbContextに接続されているかどうかを確認するための最も合理的な方法は何ですか?

そして私はそれをこのように実装しました:

var attachedEntity = context.ChangeTracker.Entries<T>().FirstOrDefault(x => x.Entity.Id == entity.Id);

                // If the entity is already attached. 
                if (attachedEntity != null)
                {
                    // Set new values
                    attachedEntity.CurrentValues.SetValues(entity);
                }
                else
                {
                    // Else attach the entity (if needed)
                    if (context.Entry(entity).State == EntityState.Detached)
                    {
                        Entities.Attach(entity);
                    }
                    // Set the entity's state to modified
                    context.Entry(entity).State = EntityState.Modified;
                }
                context.SaveChanges();

注:EntitiesIDbSet<T>からのものcontext.Set<T>()であり、上記のコードは私のジェネリックリポジトリのUpdate()メソッドからのものです。

于 2012-10-13T07:41:05.270 に答える
1

見落とされることが多い:Context.Set<T>.Local() 問題のタイプに添付されたエンティティのみを提供します。

于 2013-02-11T00:38:30.813 に答える
0

この記事: http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2007/08/27/9656.aspxには、ObjectStateManager.

ここから:

ここで起こっていることはほぼ間違いなく、削除しようとしているオブジェクトがアタッチされていませんが、デタッチされたインスタンスに読み込まれた関連エンティティまたはコレクションが既に ObjectContext にアタッチされていることです。そのため、削除しようとしているエンティティを添付しようとすると、既に添付されているエンティティを含むグラフ全体を添付しようとします。

この種の問題は少し面倒なので、私の場合は、1 つのusing(Context context = new MyEntities())ブロック内でできるだけ多くのアクティビティを実行するようにしています。

もう 1 つのアドバイスは、オブジェクトを追加する前に、そのオブジェクトがまだ存在していないことを確認することです。当たり前のことですが、過去に何度かそのことにつまずいたことがあります。

于 2012-10-13T04:19:40.570 に答える