我正在使用ASP.NET MVC 5创建Web应用程序。
为了我的应用程序,我创建了一个seprate" 网站user "类,看起来像这样:
public class WebsiteUser
{
public WebsiteUser()
{
this.Comments = new List<CommentEntityModel>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ApplicationUser IdentityUser { get; set; }
public ICollection<CommentEntityModel> Comments { get; set; }
}
我尝试并在网站上注册新用户时,我的问题就来了。
我的注册操作看起来像
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Username, Email = model.Email };
var websiteUser = service.CreateWebsiteUser(user);
var result = await UserManager.CreateAsync(user, model.Password);
var websiteUserResult = service.RegisterWebsiteUser(websiteUser);
UserManager.AddToRole(user.Id, UserRoles.WebsiteUser.ToString());
if (result.Succeeded && websiteUserResult)
{
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
几乎是身份创建的默认一个,除了这两行:
var websiteUser = service.CreateWebsiteUser(user);
var websiteUserResult = service.RegisterWebsiteUser(websiteUser);
我在服务中为他们拥有的是:
createwebsiteuser((
public WebsiteUser CreateWebsiteUser(ApplicationUser appuser)
{
var user = new WebsiteUser
{
Name = appuser.UserName,
IdentityUser = appuser
};
return user;
}
registerwebsiteuser((
public bool RegisterWebsiteUser(WebsiteUser websiteUser)
{
try
{
this.context.WebsiteUsers.Add(new WebsiteUser {Name = websiteUser.Name, IdentityUser = websiteUser.IdentityUser});
this.context.SaveChanges();
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
我的问题是,每当我尝试注册一个新用户时,我都会在 this.context.savechanges(( line上获得异常|名称|已经存在" 。
|名称| 基本上是aspnetusers表中用户名列的值。
我真的很困难,找不到解决方案。(我什至不明白为什么会发生这样的错误(
我的DB结构对我来说似乎还可以,所以我想问题在其他地方。
我能想到的唯一解决方案是完全删除我自己的用户类,只需在DeAfult ASP用户中添加属性。
任何帮助都非常感谢。
解决了它。如果有人面临类似的问题,请在这里留在这里。
基本上,由于一些伏都教魔法,我不明白,当您尝试将纯粹创建的应用程序用户添加到自定义用户类的idenityuser属性中时,EF搞砸了,以为您正在使用2个数据上下文。
解决此问题的方法是使用 .find(id(在数据库中找到应用程序使用者,然后将其提供给属性。
所以,而不是去
public bool RegisterWebsiteUser(ApplicationUser appUser)
{
this.context.YourUsers.Add(new YourUser {IdentityUser = appUser});
this.context.SaveChanges();
}
您这样做:
public bool RegisterWebsiteUser(ApplicationUser applicationUser)
{
string id = applicationUser.Id;
var userFromDb = context.Users.Find(id);
this.context.YourUsers.Add(new YourUser {IdentityUser = userFromDB});
this.context.SaveChanges();
}