3

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リクエストにまたがらないという印象を持っていたので、これにシングルトンを使用しました。コメントから、それが問題になる可能性があると思います。家に帰ったらこれを見ます。

4

1 に答える 1

3

RE:ご覧のとおり、リクエストのライフサイクル全体でEFへの呼び出しは1回だけです。

示されているコードからわかる限り、ObjectContextの有効期間はアプリケーションの有効期間である可能性があります。もしそうなら、それはおそらくここでの問題です。

ObjectContextの有効期間を管理する方法を説明できますか..それはHttpリクエストごとですか?

于 2010-10-29T05:59:20.967 に答える