MVC4 EF代码第一存储库模式多对多编辑不更新

时间:2013-10-17 06:09:10

标签: entity-framework asp.net-mvc-4 data-binding ef-code-first many-to-many

我几天来一直在嘲笑我的大脑并尝试了许多“修复”,但都无济于事。

我首先使用MVC4和EF代码,以及多对多关系的存储库模式。正如我所知,当我为数据库播种时,表格是正确创建的,我的显示正确显示了值。

我遇到问题的地方是尝试保存编辑。我有一个编辑视图,其中一个列表框包含一组枚举的对象(B),在提交(HttpPost)上,我想基本上调用A.ClassBs.Clear()和db.SaveChanges()。但是当我这样做时,ClassA.ClassBs不是空白的。

例如,如果我从A更新另一个属性,我必须在db.SaveChanges()之前包含db.Entry(ClassA).State = EntityState.Modified,否则更改不会保存到数据库中。

当我包含EntityState.Modified行时,ClassA会按预期更新,但多对多关系除外。 ClassA.ClassBs没有变化。

这是一些

Models
class A
{
  ...
  virtual IEnumerable<ClassB> ClassBs {get;set;}
}

class B
{
  ...
  virtual IEnumerable<ClassA> ClassAs {get;set;}
}

Controller
public ActionResult Edit(int id - 0)
{
   ... (create viewmodel)
   return View(viewmodel)
}

[HttpPost]
public ActionResult Edit(viewmodel)
{
  viewmodel.A.ClassBs.Clear();
  db.Entry(viewmodel.A).State = EntityState.Modified;
  db.SaveChanges();
}

View
@Html.ListBoxFor(model => model.ClassA.ClassBs, Model.ClassBs)

我的绑定发生了奇怪的事情。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您在分离的实体上调用viewmodel.A.ClassBs.Clear()。在调用ClassBRemove之前,您需要附加实体与其相关的Clear,以便上下文知道要删除的内容。

how-to-delete-many-to-many-relationship-in-entity-framework

如何Add/Attach and Entity States