2011-01-04 3 views
0

私はいくつかの日から大きな問題を抱えています。私はEntity Frameworkの初心者です。 私はグループとニュースという2つのエンティティを持っています。 1つまたは複数のグループがニュースを見ることができます。私は2つのリポジトリ(newsRepositoryとgroupsRepository)を使用します。「EntityオブジェクトはIEntityChangeTrackerの複数のインスタンスで参照できません」.net MVC2とEntity Framework4

このニュースのための私の作成方法は次のとおりです。

public ActionResult Create() 
    { 
     return View(new CreateNewsViewModel(new News())); 
    } 

    [HttpPost] 
    public ActionResult Create(CreateNewsViewModel model) 
    { 
     model.news.CategoryId = Int32.Parse(Request.Form["news.CategoryId"]); 

     if (ModelState.IsValid) 
     { 
      News news = new News(); 

      DateTime date = DateTime.Now; 

      //AuthorId a recuperer 
      news.AuthorId = 1; 
      news.Title = IntranetTools.UppercaseFirst(model.news.Title.Trim()); 
      news.Content = model.news.Content; 
      news.IsVisible = Request.Form["news.IsVisible"].Contains("true"); 
      news.CreateDate = date; 
      news.PublicationDate = date; 
      news.LastChangedDate = date; 
      news.CategoryId = model.news.CategoryId; 

      // Collection des groupes concernés 
      foreach (var c in model.allGroups) 
      { 
       if (Request.Form["" + c.GroupId].Contains("true")) 
       { 
        News.Groups.Add(c); 
       } 
      } 

      _newsRepository.AddToNewsSet(news); 
      _newsRepository.SaveChanges(); 

      return Redirect("/NewsAdmin/Index/"); 
     } 
     return View(model); 
    } 

私はすべての私のグループが既に作成されていることを言います。私はちょうど(チェックボックスを介してユーザーによって選択された)グループを挿入したい。私の "CreateNewsViewModel"では、私は自分のDB内の既存のすべてのグループを含むグループのリストを作成します。 "foreach"ループを使ってリストを取得し、各グループのチェックボックスを作成します。

コントローラで同じリストを再利用して、チェックボックスがオンになっているかどうかを比較します。 「真」の値ごとに、作成したばかりのニュースのグループコレクションにグループを追加します。これにより

、私はこのエラーメッセージを取得:

(ラインで_newsRepository.AddToNewsSet(ニュース);)

私がしようと、「エンティティオブジェクトがIEntityChangeTrackerの複数のインスタンスによって参照することはできませんが。」いくつかのソリューションが、私はまだこの問題を解決する方法を理解していない。私は明示的に2つのコンテキストを使用し、他のコンテキストに私のオブジェクトをアタッチ/デタッチ場合は、すべての


編集

ため

おかげで実際に、それは罰金だと私はerrosを持っていません。

  ObjectContext context = _newsRepository.Context; 
      ObjectContext context2 = _groupsRepository.Context; 

      foreach (var c in groups) 
      { 
       if (Request.Form["" + c.GroupId].Contains("true")) 
       { 
        context2.Detach(c); 
        context.Attach(c); 
        news.Groups.Add(c); 
       } 
      } 

私が(単一の要求の処理中に)私のリポジトリに同じのObjectContextを与えるために(私はNinjectフレームワークを使用)ラディスラフMrnkaのソリューションを使用し、依存性注入を使用したいと思います。 私はコンセプトを理解していますが、コード化する方法はわかりません。

答えて

1

エラーメッセージは、Newsオブジェクトまたは関連するGroupオブジェクトが、別のObjectContextインスタンスに関連付けられていることを示します。リポジトリはどのように実装され、どのようにしてmodel.allGroupsを取得しましたか?独自のObjectContextインスタンスを持つGroupsRepositoryからallGroupsをロードした場合、おそらく問題の原因になります。解決策は次のようになります。

    あなたは、データベースからそれらをロードする際
  • デタッチは、オブジェクトを単一の要求処理中のすべてのリポジトリの
  • (優先)株式単一のObjectContextを使用すると、オブジェクトをロード
  • 閉じるObjectContextは(ObjectContextには、Detachメソッドを持っています)データベースから
+0

オハイオ州ok ...実際には、それは..すべてのGroupGroupが私のGroupsRepositoryからロードされています。あなたの最初の解決策は私のために良いようです。私はこれをどうやって実装できるのですか? (私はいくつかの説明を検索しましたが、私にとっては少し曖昧です。) – Areasta

+0

リポジトリにコンストラクタのパラメータとしてObjectContext(またはいくつかのラッパー)がある依存関係注入を使用しています。 –

+0

私にこの例を教えてもらえますか?情報については、Ninjectを使っています。 – Areasta

関連する問題