1

我根据本教程编写了一个多对多的实现,不幸的是我无法实际保存发布到我的模型的任何值。

[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.Sitescontext.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();

这会将当前用户附加到上下文,将与其关联的所有站点加载到上下文中(因为被发布的用户实际上并不包含该信息),然后一切正常!

将所有数据发布到单个对象可能是最佳实践,但我不确定如何做到这一点。

4

1 回答 1

0

我认为您需要检查您ConnectionString 的 每次构建应用程序时可能会覆盖您的 mdf 文件,这就是为什么您认为您的更改没有持久化的原因。

于 2013-03-03T01:23:37.477 回答