我得到错误:“实体对象不能被IEntityChangeTracker的多个实例引用。”.net MVC2和Entity Framework4

时间:2011-01-04 21:12:14

标签: entity-framework asp.net-mvc-2 entity

有些日子我有一个大问题,我是实体框架的初学者。 我有2个实体:集团和新闻。一个或多个组可以看到新闻。我使用了两个存储库(newsRepository和groupsRepository)。

这是我的新闻创建方法:

    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”中,我创建了一个包含数据库中所有现有组的组列表。我通过“foreach”循环在我的视图中获取列表,并为每个组创建一个复选框。

我在控制器中重复使用相同的列表来比较是否已选中复选框。 对于每个“真实”值,我在我的新闻的组集合中添加组(刚刚创建)。

有了这个,我得到了这个错误信息:

“IEntityChangeTracker的多个实例无法引用实体对象。”(行_newsRepository.AddToNewsSet(新闻);)

我尝试了一些解决方案,但我仍然不明白如何解决这个问题。

全部谢谢


修改

实际上,如果我明确地使用两个上下文并将我的对象分离/附加到其他上下文,那就没问题了。

            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);
                }
            }

我想使用Ladislav Mrnka的解决方案并使用依赖注入(我使用Ninject框架)将相同的ObjectContext提供给我的存储库(在单个请求处理中)。 我理解这个概念,但我不知道如何编码。

1 个答案:

答案 0 :(得分:1)

错误消息表明News对象或任何相关的Group对象附加到不同的ObjectContext实例。您的存储库是如何实现的?您是如何获得model.allGroups的?如果您从GroupsRepository加载了具有自己的ObjectContext实例的allGroups,那么它可能是问题的根源。解决方案是:

  • (首选)在单个请求处理中为所有存储库共享单个ObjectContext
  • 从数据库加载对象时分离对象(ObjectContext具有分离方法)
  • 从数据库加载对象时关闭ObjectContext