Asp.net mvc mvc 5将第一个用户ID编码为外键-如何保存数据
使用MVC5代码优先的方法 我没有更改用户存储,而是在ApplicationUser类中添加了一个名为Name的属性。因此,它看起来如下所示:-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
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来获取该公司的用户列表。如果延迟加载可用,那么它将自动填充它。如果延迟加载不可用,那么您需要调用来填充它,但无论哪种方式,它都会更自然。