2017-05-04 89 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(); 
}