【问题标题】:How do I execute db.SaveChanges() then update database again?如何执行 db.SaveChanges() 然后再次更新数据库?
【发布时间】:2016-05-25 22:11:01
【问题描述】:

POST 期间在我的控制器中,我如何更新我的USERS 实体,然后使用新创建的UserID 在我的USERROLES 表中为它们分配一个角色。以下是我目前的代码,尝试保存第二组更改时出错。

我的USERROLES 表由UserIDRoleID 的组合组成。 USERS 中的UserID 是在插入表格时自动生成的。

如果有人能告诉我如何实际解决这个问题,那就太棒了 - 我对 ASP MVC 还是很陌生。

using (var db = new SwinTCSEntities()) // initialise db object
{
    // add values to USERS
    db.USERS.Add(new USERS
    {
        FirstName = model.FirstName,
        LastName = model.LastName,
        Username = model.Username,
        Password = Crypto.HashPassword("pass1234"),
        Email = model.Email,
        OfficeNo = model.OfficeNo,
        PhoneNo = model.PhoneNo,
        RegistrationDateTime = DateTime.Now,
        MeetingNotifications = true,
        SubmissionNotifications = true,
        TeamAssignNotifications = true,
        OverdueNotifications = true
    });
    db.SaveChanges(); // this goes through fine

    if (db.USERS.Any(x => x.Username == model.Username)) // it's able to get the new user value
    {
        if (model.IsAdmin && !model.IsStudent)
        {
            db.USERROLES.Add(new USERROLES
            {
                UserID = db.USERS.First(x => x.Username == model.Username).UserID,
                RoleID = db.ROLES.First(x => x.Name == "Admin").RoleID,
                DateAdded = DateTime.Now
            });
            // It errors here with a concurrency error
            db.SaveChanges();
        }
    }
}

【问题讨论】:

    标签: asp.net sql-server asp.net-mvc post controller


    【解决方案1】:
    using (var db = new SwinTCSEntities()) // initialise db object
    {
        // create USERS object
        var user = new USERS
        {
            FirstName = model.FirstName,
            LastName = model.LastName,
            Username = model.Username,
            Password = Crypto.HashPassword("pass1234"),
            Email = model.Email,
            OfficeNo = model.OfficeNo,
            PhoneNo = model.PhoneNo,
            RegistrationDateTime = DateTime.Now,
            MeetingNotifications = true,
            SubmissionNotifications = true,
            TeamAssignNotifications = true,
            OverdueNotifications = true
        };
    
    
       //load the admin role in the EF context and add it to this new user
            if (model.IsAdmin && !model.IsStudent)
            {
                var adminRole = db.ROLES.First(x => x.Name == "Admin");
                user.USERROLES.Add(new USERROLES
                {
                    Role = adminRole,
                    DateAdded = DateTime.Now
                });
            }
    
    
        //add the user to the USERS set  
        db.USERS.Add(user);
    
        db.SaveChanges(); // EF is smart enough to link the entities on SaveChanges
    
    }
    

    【讨论】:

    • 当我修改为使用users 对象时,在到达 db.SaveChanges() 时仍然会出现并发异常。有什么想法吗?
    • 你得到了什么异常?
    【解决方案2】:

    不要使用 SaveChanges 2 次,我可以展示其他解决方案: 1. 我觉得你的新用户有唯一的 ID 是吗?所以使用 try 和 catch 方法或类似的东西:

    var user = new ApplicationUser { UserName = userViewModel.Email, Email = userViewModel.Email };
                var adminresult = await UserManager.CreateAsync(user, userViewModel.Password);
    
                //Add User to the selected Roles 
                if (adminresult.Succeeded)
                {
                    if (selectedRoles != null)
                    {
                        var result = await UserManager.AddToRolesAsync(user.Id, selectedRoles);
                        if (!result.Succeeded)
                        {
                            ModelState.AddModelError("", result.Errors.First());
                            ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name");
                            return View();
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("", adminresult.Errors.First());
                    ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");
                    return View();
    
                }
                return RedirectToAction("Index");
    

    您可以根据需要更改选定的角色,对不起我的英语。

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 2021-11-04
      • 2012-02-17
      • 2022-01-21
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多