更新/编辑实体时,许多人不保存

时间:2013-03-01 20:22:48

标签: asp.net asp.net-mvc-3 entity-framework ef-code-first many-to-many

我的控制器中的[HttpPost]编辑方法有问题,它没有保存对用户编程所做的更改,这很奇怪,因为create方法正在使用它使用相同的帮助方法,这是我的代码:

视图模型:

public class UserViewModel
{
    public User User { get; set; }
    public virtual ICollection<AssignedUserRole> UserRoles { get; set; }
    public virtual List<Company> Companies { get; set; }
}

控制器:

[HttpPost]
    public ActionResult Edit(UserViewModel userViewModel)
    {
        if (ModelState.IsValid)
        {
            var user = userViewModel.User;
            user.UserRoles.Clear();
            AddOrUpdateRoles(user, userViewModel.UserRoles);
            context.Entry(user).State = EntityState.Modified;
            context.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(userViewModel);
    }

帮手方法

private void AddOrUpdateRoles(User user, ICollection<AssignedUserRole> assignedUserRoles)
    {
        foreach (var assignedRole in assignedUserRoles)
        {
            if (assignedRole.Assigned)
            {
                var userRole = new UserRole { Id = assignedRole.UserRoleId };
                context.UserRoles.Attach(userRole);
                user.UserRoles.Add(userRole);
            }
        }
    }

用户对象中的所有内容都在更新,除了用户角色,我无法找到问题,因为我正在调试并执行一步,我可以看到用户已分配了正确/更新的角色。

1 个答案:

答案 0 :(得分:1)

我能够通过进行以下更改来解决此问题:

 private void AddOrUpdateRoles(User user, ICollection<AssignedUserRole> assignedUserRoles)
    {
        foreach (var assignedRole in assignedUserRoles)
        {
            if (assignedRole.Assigned)
            {
                var userRole = context.UserRoles.Find(assignedRole.UserRoleId);
                user.UserRoles.Add(userRole);
            }
        }
    }


 [HttpPost]
    public ActionResult Edit(UserViewModel userViewModel)
    {
        if (ModelState.IsValid)
        {
            var user = userViewModel.User;
            context.Entry(user).State = EntityState.Modified;
            context.Entry(user).Collection(u => u.UserRoles).Load();
            user.UserRoles.Clear();
            AddOrUpdateRoles(user, userViewModel.UserRoles);
            context.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(userViewModel);
    }

我必须“加载”用户的用户名,否则清算无效。