2012-01-30 15 views
2

ダーリンのanswerに私のコントローラをスリミングさせた質問に私は従っていましたが、この問題に遭遇していますIEntityChangeTracker例外:"IEntityChangeTrackerの複数のインスタンスでエンティティオブジェクトを参照することはできません"

エンティティオブジェクトは、IEntityChangeTrackerの複数のインスタンスで参照できません。

ここに私のモデルバインダーがあります。この後

public class PostModelBinder : IModelBinder 
{ 
    private readonly IPostRepository _repository; 

    public PostModelBinder(IPostRepository repository) 
    { 
     _repository = repository; 
    } 

    public object BindModel(ControllerContext controllerContext, 
          ModelBindingContext bindingContext) 
    { 
     var postIDValue = controllerContext.Controller.ValueProvider.GetValue("postID"); 
     int postID; 

     if (postIDValue == null || !int.TryParse(postIDValue.AttemptedValue, out postID)) 
      return null; 

     return _repository.FindPost(postID, filterByPublished: true); 
    } 
} 

、私のカスタムアクションフィルターは、単にポストの検証のビットを行い、ポストが有効でない場合はリダイレクトします。この時点まではすべてが問題ありません。

public class PostsController : Controller 
{ 
    private IPostRepository postRepository; 

    // snip... 

    [AutoMap(typeof(Post), typeof(PostViewModel)), HttpGet] 
    [PostActionFilter] 
    public ActionResult ShowPost(Post model) 
    { 
     postRepository.PostVisited(model); 

     return View(model); 
    } 
} 

私は効果的に同じオブジェクトを参照する2つのリポジトリで終わるだけに待っている悪いモジョのように思えることをするので、私は文句IEntityChangeTracker年代を理解する:私は、カウントを読んで記事を更新しようとすると、エラーが私のコントローラで発生します起こる。 PostVisited()コールをPostModelBinderにプッシュすることはできますが、モデルを更新することはそこに属する動作のようには見えません。

別の方法がありますか?

ありがとうございます。

+0

奇妙なことに、なぜHttpGetアクションにリダイレクトするのではなく(Show/Redirect/Get pattern?)、これを正しく読んでいますか?ShowPostに投稿していますが、HttpGetを指定してから、 –

+0

@AdamTuliper ShowPostは私のPostsController内にブログ投稿を表示しています。それはHttpPostを処理していません。 –

答えて

2

エラーから、あなたの2つのIPostRepository実装オブジェクトが異なるEntity Frameworkオブジェクトコンテキストを使用すると仮定します。要求全体を通じて同じオブジェクトコンテキストを使用してこれを修正できます。

一部のDIコンテナでは、要求ごとのオブジェクトの存続期間がサポートされます。そうしないと、HttpContext.Itemsにオブジェクトコンテキストを遅延ロードして格納し、this questionに記載されているようにリクエストの最後に処分できます。

+0

こんにちはスティーブ、答えと質問のリンクありがとう。これは、コンテキストのオブジェクトマネージャを作成し、各リクエストで新しいコンテキストを作成し、コンストラクタのリポジトリに渡してから、要求の最後にコンテキストを破棄することを意味しますか? –

+0

はい、あります! :) –

+0

申し訳ありませんがあなたの答えを受け入れるような長い時間がかかりました。私は数週間病気であったが、その後、これは依存症注射を使うことを学ぶ良い言い訳だったと私は判断した。私はNinjectに関する関連する質問をしなければならなくなり、誰かが興味を持ってテスト実装をして質問をしました(自己回答しました)(http://stackoverflow.com/a/9231697/729541)。 –

関連する問題

 関連する問題