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();