Asp.net mvc mvc 5将第一个用户ID编码为外键-如何保存数据

Asp.net mvc mvc 5将第一个用户ID编码为外键-如何保存数据,asp.net-mvc,Asp.net Mvc,使用MVC5代码优先的方法 我没有更改用户存储,而是在ApplicationUser类中添加了一个名为Name的属性。因此,它看起来如下所示:- public class ApplicationUser : IdentityUser { [Required] [StringLength(100)] public string Name { get; set; } public async Task<ClaimsIdentity> GenerateUs

使用MVC5代码优先的方法

我没有更改用户存储,而是在ApplicationUser类中添加了一个名为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 CompanyUsers
{
    public int Id { get; set; }

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

    [Required]
    public virtual ApplicationUser User { get; set; }
}
[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);
    }
现在,当我注册一个用户时,我正在设置它的角色以及该用户所属的公司,但似乎内置代码中定义的UserManager已经保存了它。因此,在添加CompanyUsers数据后,当我调用applicationDbContext.Savechanges时,它会失败,因为用户已经保存在数据库中。你能告诉我怎样才能做到吗?我可以用其他的逻辑,比如在创建一个用户之后,在一个单独的函数中将用户分配给公司,但是我想知道在这种情况下的解决方案。我还可以重新设计用户商店

我在AccountController中修改的注册函数如下:-

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

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

    [Required]
    public virtual ApplicationUser User { get; set; }
}
[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代码优先的方法,所以如果您使用技术术语,我可能不理解,提前感谢您的帮助

尝试在if结果中添加以下代码。成功块:


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

您的Company类需要包含虚拟IEnumerable。另外,我建议将用户角色添加到CompanyUser类中。这样,一个用户可以在不同的公司扮演不同的角色。这很好,你能解释一下为什么公司类需要虚拟IEnumerable吗?嗯,公司有用户,对吗?那么它们应该在物体上。这样说吧,当你有了公司123,你应该可以做company123.CompanyUsers来获取该公司的用户列表。如果延迟加载可用,那么它将自动填充它。如果延迟加载不可用,那么您需要调用来填充它,但无论哪种方式,它都会更自然。