ASP.NET MVC 5身份 - 使用自定义用户时“用户名已存在”
问题描述:
我使用ASP.NET MVC 5创建Web应用程序。ASP.NET MVC 5身份 - 使用自定义用户时“用户名已存在”
对于我创建了一个seprate“网站用户”类,它看起来像这样我的应用程序的目的:
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异常()线,称为“名称为|名称|的用户名已经存在”
|名称|基本上是在ASPNetUsers表username列的值
我很坚持,并不能找到一个解决方案(我甚至无法理解。为什么像这样的错误会发生)
我的数据库结构似乎好了给我,所以我想这个问题是其他地方。
我能想到的唯一的解决办法,就是彻底删除我自己的用户类里将属性添加到deafult ASP用户。
任何帮助,非常感谢。
答
解决了它。 如果有人遇到类似问题,请将此处留下。基本上,由于一些巫术魔法,我不明白,当你尝试只添加刚创建的ApplicationUser到你的自定义User类的IdenityUser的属性时,EF拧紧了,以为你正在使用2个数据上下文。
解决此问题的方法是改为使用。找到(id)在数据库中找到ApplicationUser,然后将其提供给属性。
所以,与其去
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();
}
你有没有调试的代码,看看是什么websiteUser.Name价值。 也为什么在插入创建WebsiteUser的新实例: 'this.context.WebsiteUsers.Add(新WebsiteUser {名称= websiteUser.Name,IdentityUser = websiteUser.IdentityUser})' 可以改成 '这.context.WebsiteUsers.Add(websiteUser)' – Scrobi
正是因为我正在调试,并希望看到这是否会有所帮助:D 'websiteUser.Name'就像它应该是,但它不会造成问题。 如果我不设置我的Web用户的'IdentityUser'属性,我没有得到一个异常。 因此,当我分配一个IdentityUser到我的网站用户:( – Kobek
是否它与WebsiteUser.Name&IdentityUser,名称之间的冲突? – Scrobi