我正在使用ASP.NET MVC 5来创建一个Web应用程序。
出于我的应用程序的目的,我创建了一个单独的“网站用户”类,如下所示:
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);
}
几乎是Identity创建的默认值,除了这两行:
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()行中获得一个例外,说“具有该名称的用户名|名称|已存在“。
| Name | 基本上是ASPNetUsers表中UserName列的值。
我真的被卡住了,无法找到解决方案。 (我甚至不明白为什么会发生这样的错误)
我的数据库结构对我来说似乎没问题,所以我猜问题就在其他地方。
我能想到的唯一解决方案是完全删除我自己的User类,只是向deafult ASP用户添加属性。
非常感谢任何帮助。
答案 0 :(得分:1)
解决了它。 如果有人遇到类似的问题,请留在这里。
基本上,由于一些巫术魔法,我不明白,当你尝试将刚刚创建的ApplicationUser添加到自定义User类的IdenityUser属性时,EF搞砸了,以为你在使用2个数据上下文。
解决此问题的方法是使用 .Find(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();
}