MVC3でエンティティフレームワークのコードに問題が発生しました。Entity Frameworkコードファースト: "ObjectStateManagerは同じキーを持つ複数のオブジェクトを追跡できません。"
ObjectStateManagerに同じキーを持つオブジェクトがすでに存在しています。 ObjectStateManagerは同じ キーを持つ複数のオブジェクトを追跡できません。
これは何度もSOに対処されていますが、私の状況で提案されている解決法を利用するのに問題があります。ここで
は、コードサンプルです:
明確に編集FestORM.SaleMethod method = new FestORM.SaleMethod
{
Id = 2,
Name = "Test Sale Method"
};
FestContext context = new FestContext();
//everything works without this line:
string thisQueryWillMessThingsUp =
context.SaleMethods.Where(m => m.Id == 2).Single().Name;
context.Entry(method).State = System.Data.EntityState.Modified;
context.SaveChanges();
:私はすでにデータベースに存在するオブジェクトを更新しようとしています。
コードに記載されているクエリがなくてもすべて正常に動作します。私のアプリケーションでは、私のコントローラはコンテキストをインスタンス化しており、同じコンテキストがコントローラによって使用されるいくつかのリポジトリに渡されるため、最初のクエリ操作に別のコンテキストを使用することはできません。私は、ObjectStateManagerで追跡されているエンティティを削除しようとしましたが、そのいずれかを取得することはできません。私は、両方の条件で動作する解決策を見つけようとしています。ObjectStateManagerによって追跡されるオブジェクトを更新することがありますが、時にはまだ追跡されていないことがあります。
FWIW、私の本当のリポジトリ機能は、ちょうど上記のコードのように、次のようになります。
public void Update(T entity)
{
//works ONLY when entity is not tracked by ObjectStateManager
_context.Entry(entity).State = System.Data.EntityState.Modified;
}
public void SaveChanges()
{
_context.SaveChanges();
}
任意のアイデア?私はあなたが呼び出す前に明白な答えは、あなたが実際にデータベースにメソッドオブジェクトを保存していないということでしょう...あまりにも長い間
ありがとうございます。 (私が新しいのであなたの回答に投票することはできません)これは、将来の更新に先行するクエリをいつ実行するのか分かりません。クエリがサービス層のどこかに埋め込まれている可能性があります。最後に、クエリされた同じエンティティで更新を行うと、エラーが発生します。コンテキストトラッキングからオブジェクトを削除したり、コンテキストによってトラッキングされているオブジェクトを取得したり、問題のオブジェクトを更新していることをコンテキストに伝える方法はありますか?私はこの方向でいくつかを研究しましたが、まだ運はありません。 – Josh
これは、クエリの意図に依存します。クエリがエンティティをコンテキストに持って来て、いつもそうであるように、それが更新され、保存されることを意図しているのであれば、そのエンティティが持ち込まれたことを保存する前に、以前に持ち込まれた。クエリの目的が、エンティティをコンテキストに持ち込まずに何らかの理由でデータベースからエンティティの一部のプロパティを取得する場合は、上記のようにそのクエリでAsNoTrackingを使用します。 –
エンティティが持ち込まれていることを確認するには、以前のコメントに追加するには、エンティティのプロパティを更新して保存する前にFindメソッドを使用します。 Findではなくクエリを使用することもできます。デフォルトでは、クエリはエンティティがコンテキストにまだ存在しない場合にのみエンティティを持ち込みます。しかしFindはより効率的です。 –