0

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

我正在尝试添加一些Betas 到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按预期填充。

4

1 回答 1

1

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

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

如果集合是延迟加载,语句alpha.Betas.Clear();会先加载集合,然后立即清除。(alpha此时必须已附加到上下文中)。

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

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

在删除/添加项目之前。

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

于 2013-04-22T13:27:42.647 回答