mvc 5代码第一个userid作为外键 - 如何保存数据

时间:2017-05-11 15:54:26

标签: asp.net-mvc

首先使用MVC5代码。

我还没有更改用户存储,在ApplicationUser Class中添加了一个名为Name的属性。所以看起来如下: -

public class ApplicationUser : IdentityUser
{
    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

我有一个公司类,如下所示: -

public class Company
{
    public int Id { get; set; }

    [Required]
    [StringLength(255)]
    public string Name { get; set; }
}

公司肯定会有多个用户,但在我的设计中,用户可以与多个公司关联。所以我有一个单独的CompanyUsers类,如下所示: -

public class CompanyUsers
{
    public int Id { get; set; }

    [Required]
    public virtual Company Company { get; set; }

    [Required]
    public virtual ApplicationUser User { get; set; }
}

现在,当我注册用户时,我设置了自己的角色以及用户所属的公司,但似乎内置代码中定义的UserManager已经保存了它。因此,在添加CompanyUsers数据后,当我调用applicationDbContext.Savechanges()时,它会失败,因为用户已经保存在数据库中。你能告诉我如何实现它吗?我可以在其他逻辑中执行此操作,例如在创建用户之后,在单独的函数中将用户分配给公司,但我想在这种情况下知道解决方案。我也可以重新设计用户商店。

我在AccountController中修改的寄存器功能如下: -

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Name = model.Name };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await UserManager.AddToRoleAsync(user.Id, model.Role);
                var userCompany = new CompanyUsers
                {

                    Company = _context.Companies.First(t => t.Id == model.CompanyId),
                    User = user
                };

                try
                {
                    _context.CompanyUsers.Add(userCompany);
                    _context.SaveChanges();// throws exception
                }
                catch (DbEntityValidationException dbEx)
                {
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                        }
                    }
                }
                return RedirectToAction("UserViewAll", "Manage");
            }
            AddErrors(result);
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

我刚开始使用mvc代码的第一种方法,所以如果你使用技术术语我可能不明白,谢谢你提前帮助!!!!!

1 个答案:

答案 0 :(得分:1)

尝试在if (result.Succeeded)块中添加以下代码:

_context.Entry(user).State = EntityState.Unchanged;

问题似乎是此方法中的数据上下文不知道user实体的状态,因为UserManager.CreateAsync使用单独的上下文。将实体分配给CompanyUser实体时附加实体,然后此数据上下文尝试将其另存为新实体。