我根据本教程编写了一个多对多的实现,不幸的是我无法实际保存发布到我的模型的任何值。
[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);
}
和
private void UpdateUserSites(string[] selectedSites, User userToUpdate)
{
// if no sites are selected, give the user a fresh empty list of sites
if (selectedSites == null)
{
userToUpdate.Sites = new List<Site>();
return;
}
var newSelectedSites = new HashSet<string>(selectedSites);
var existingUserSites = new HashSet<int>(userToUpdate.Sites.Select(site => site.Id));
foreach (var site in context.Sites)
{
if (newSelectedSites.Contains(site.Id.ToString()))
{
if (!existingUserSites.Contains(site.Id))
{
// add a new site to the user
userToUpdate.Sites.Add(site);
}
}
else
{
if (existingUserSites.Contains(site.Id))
{
// remove an existing site from the user
userToUpdate.Sites.Remove(site);
}
}
}
}
该UpdateuserSites
函数肯定是在向列表中添加元素,但是在我尝试使用context.SaveChanges()
数据库保存更改后没有得到更新。
编辑
我注意到了几件事。一,在我的函数中迭代站点时UpdateUserSites
,该站点有一些引发异常的属性。它与在迭代现有查询集时执行查询有关。我通过更改context.Sites
为context.Sites.ToList()
二,我的Create
功能工作得很好。它添加了一个新用户并向该用户添加了一个站点,而不会出现故障。除了Sites
属性之外,我添加的新条目以及现有条目都是可编辑的。
[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);
}
编辑 2
这当然与我的实体和当前有关DbContext
——我在函数中添加了context.Users.Attach(user);
正确的内容,现在我至少可以向用户添加网站。现在我无法删除它们。但至少我在做某事。if(ModelState.IsValid)
Edit
编辑 3
我已经恢复Edit
到原来的状态,而是UpdateUserSites
用以下两行修改了我的函数
context.Users.Attach(userToUpdate);
context.Entry(userToUpdate).Collection(u => u.Sites).Load();
这会将当前用户附加到上下文,将与其关联的所有站点加载到上下文中(因为被发布的用户实际上并不包含该信息),然后一切正常!
将所有数据发布到单个对象可能是最佳实践,但我不确定如何做到这一点。