没有添加多对多的关系

时间:2013-04-22 12:47:39

标签: asp.net-mvc entity-framework

我有两个实体AlphaBeta,它们之间有M:M的关系。

我正在尝试向Beta添加一些Alpha,如下所示:

public ActionResult Edit(Alpha alpha)
{
  if (ModelState.IsValid)
  {
    var selectedBetaIds = //populated from checkboxes in the view

    var selectedBetas = db.Betas.Where(b => selectedBetaIds.Contains(b.Id));

    alpha.Betas.Clear();

    foreach (var b in selectedBetas)
      alpha.Betas.Add(b);

    db.Entry(alpha).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Index");
  }
  return View(alpha);
}

但表格AlphaBetas没有添加任何条目,也没有alpha.Betas.Count() == 0

在上述方法的db.SaveChanges()之后奇怪地,在调试中,Betas按预期填充。

1 个答案:

答案 0 :(得分:1)

属性alpha.Betas必须启用延迟加载。即它应该是虚拟的,延迟加载和代理生成一定不能在上下文中关闭。

原因是EF必须知道“旧”集合才能检测到它的后续更改。

如果集合是延迟加载,则语句alpha.Betas.Clear();将首先加载集合并立即清除它。 (alpha必须已附加到上下文中。)

如果您不希望延迟加载,则必须先手动加载它:

context.Entry(alpha).Collection(x => x.Betas).Load();

在删除/添加项目之前。

设置EntityState.Modified不起作用,因为它只影响标量属性(没有导航属性)。如果alpha本身没有更改,则可以删除该语句。但是,您仍然必须将alpha附加到上下文中。