【问题标题】:Many to many not saving when updating/editing entity更新/编辑实体时多对多不保存
【发布时间】:2013-03-01 20:22:47
【问题描述】:

我的控制器中的 [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);
            }
        }
    }

除了用户角色外,用户对象中的所有内容都在更新,我在调试并逐步执行时找不到问题,我可以看到用户分配了正确/更新的角色。

【问题讨论】:

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


    【解决方案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);
        }
    

    我必须“加载”用户的用户角色,否则清算将无济于事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多