Asp.net mvc 在多对多关系中向列表添加元素而不更新实体
我编写了一个基于的多对多实现,不幸的是,我无法实际保存发布到模型中的任何值Asp.net mvc 在多对多关系中向列表添加元素而不更新实体,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我编写了一个基于的多对多实现,不幸的是,我无法实际保存发布到模型中的任何值 [HttpPost] public ActionResult Edit(User user, string[] selectedSites) { if (ModelState.IsValid) { UpdateUserSites(selectedSites, user); context.Entry(user).State = EntityState.Modified;
[HttpPost]
public ActionResult Edit(User user, string[] selectedSites)
{
if (ModelState.IsValid)
{
UpdateUserSites(selectedSites, user);
context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.PossiblePartners = context.Partners;
ViewBag.Sites = PopulateSelectedSiteData(user);
return View(user);
}
及
编辑2
这当然与我的实体和当前的DbContext
有关——我添加了context.Users.Attach(user)代码>位于编辑功能中的if(ModelState.IsValid)
的右侧,现在我至少可以向用户添加站点。现在我无法移除它们。但至少我知道了一些事情
编辑3
我已将我的Edit
恢复到其原始状态,并用以下两行修改了我的UpdateUserSites
函数
context.Users.Attach(userToUpdate);
context.Entry(userToUpdate).Collection(u => u.Sites).Load();
这会将当前用户附加到上下文中,将与之关联的所有站点加载到上下文中(因为被发布的用户实际上并不包含该信息),然后一切正常
最好的做法可能是针对单个对象发布所有数据,但是我不知道怎么做。我认为你需要检查你的连接字符串
你的mdf文件很可能在每次构建应用程序时都被覆盖,这就是为什么你认为你的更改不会被持久化的原因。这不是跨构建持久化的问题,甚至在构建后重定向回索引页成功的POST
不会更新UserSites联接表,也不会向用户添加站点等。您可以尝试使用AcceptAllChangesAfterSave
选项savechanges
吗?不,似乎savechanges()
只有一个不接受任何参数的方法。是的,您可以。。请参见[link]()这是一个DbContext
对象,它只有一个SaveChanges()
函数:--但是默认情况下,DbContext.SaveChanges()
实现已经包含了您建议我尝试的选项。多对多关联始终是EF中的独立关联(与外键关联相比,在外键关联中,您还可以使用原始FK属性,如SiteId
)。这意味着:您只能通过操纵加载的元素来更改它们。正如您所发现的那样。
[HttpPost]
public ActionResult Create(User user, string[] selectedSites)
{
if (ModelState.IsValid)
{
context.Users.Add(user);
UpdateUserSites(selectedSites, user);
context.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.PossiblePartners = context.Partners;
ViewBag.Sites = PopulateSelectedSiteData();
return View(user);
}
context.Users.Attach(userToUpdate);
context.Entry(userToUpdate).Collection(u => u.Sites).Load();