首先使用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代码的第一种方法,所以如果你使用技术术语我可能不明白,谢谢你提前帮助!!!!!
答案 0 :(得分:1)
尝试在if (result.Succeeded)
块中添加以下代码:
_context.Entry(user).State = EntityState.Unchanged;
问题似乎是此方法中的数据上下文不知道user
实体的状态,因为UserManager.CreateAsync
使用单独的上下文。将实体分配给CompanyUser
实体时附加实体,然后此数据上下文尝试将其另存为新实体。