有些日子我有一个大问题,我是实体框架的初学者。 我有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提供给我的存储库(在单个请求处理中)。 我理解这个概念,但我不知道如何编码。
答案 0 :(得分:1)
错误消息表明News对象或任何相关的Group对象附加到不同的ObjectContext实例。您的存储库是如何实现的?您是如何获得model.allGroups的?如果您从GroupsRepository加载了具有自己的ObjectContext实例的allGroups,那么它可能是问题的根源。解决方案是: