ASP.NET MVCアプリに機能を追加して、データ構造の一部のフィールドを変更しようとしています。フォームの送信ボタンをクリックすると、次のアクションが呼び出されます。
[HttpPost]
public ActionResult Edit(Document doc)
{
// Attempt to save the project
if (_documentService.SaveDocument(doc) == ServiceActionResult.Success)
return RedirectToAction("List");
else
return View();
}
メソッドは次のSaveDocument()
ようになります。
public ServiceActionResult SaveDocument(Document doc)
{
if (doc == null)
return ServiceActionResult.ActionFailure;
// Check if this is a new Document (null ID)
if (doc.Id == 0)
_documentRepository.Add(doc);
else
_documentRepository.Attach(doc);
_documentRepository.SaveChanges();
return ServiceActionResult.Success;
}
ドキュメントが存在する(したがってId値を持っている)のでAttach()
、汎用リポジトリのメソッドを呼び出します。attachメソッドは次のようになります。
public void Attach(T entity)
{
_objectSet.Attach(entity);
}
オブジェクトセットのAttach()
メソッドが呼び出されると、次の例外が発生します。
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
リクエストのライフサイクル全体でEFへの呼び出しが1回しかないことがわかるので、これがなぜ発生しているのかわかりません。これが最後のAttach(entity)
呼び出しです。私は何かが足りないのですか?
参考までに、このシステムは以前は機能していましたが、壊れたように見えるのは、モデルファーストからPOCO(最新のCTP)を使用したコードファーストへの変換でした。このシナリオを除いて、他のすべての機能は以前と同じように機能します。
それが役立つ場合、私のジェネリックリポジトリは、コンテキストクラスで作成した関数を介してObjectSet
から取得します。DbContext
public ObjectSet<T> CreateObjectSet<T>() where T : class
{
return ObjectContext.CreateObjectSet<T>();
}
編集: コメントのためにコードを見回した後、コンテキスト管理用にシングルトンを実装したことを思い出しました。これは、コントローラーが1つのサービスクラスからエンティティを取得し、別のサービスクラスを使用して更新する可能性があるためです(これは私が解決しようとしていたシナリオだったと思います。しばらく前に実装しました。 d仕事を辞めるときは、よく見る必要があります)。
シングルトンは複数のhttpリクエストにまたがらないという印象を持っていたので、これにシングルトンを使用しました。コメントから、それが問題になる可能性があると思います。家に帰ったらこれを見ます。