2017-05-04 95 views
0

我使用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用户。

任何帮助,非常感谢。

+0

你有没有调试的代码,看看是什么websiteUser.Name价值。 也为什么在插入创建WebsiteUser的新实例: 'this.context.WebsiteUsers.Add(新WebsiteUser {名称= websiteUser.Name,IdentityUser = websiteUser.IdentityUser})' 可以改成 '这.context.WebsiteUsers.Add(websiteUser)' – Scrobi

+0

正是因为我正在调试,并希望看到这是否会有所帮助:D 'websiteUser.Name'就像它应该是,但它不会造成问题。 如果我不设置我的Web用户的'IdentityUser'属性,我没有得到一个异常。 因此,当我分配一个IdentityUser到我的网站用户:( – Kobek

+0

是否它与WebsiteUser.Name&IdentityUser,名称之间的冲突? – Scrobi

回答

1

解决了它。 如果有人遇到类似问题,请将此处留下。基本上,由于一些巫术魔法,我不明白,当你尝试只添加刚创建的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(); 
}