1

我使用ASP.NET CORE標識創建ASP.NET CORE應用程序。 我創建種子類以保存初次啓動應用程序的新用戶和角色。在添加角色到用戶時,在這個種子類中出現以下錯誤。Asp.net核心標識「INSERT語句與FOREIGN KEY約束衝突」

INSERT語句衝突與外鍵約束 「FK_AspNetUserRoles_AspNetUsers_UserId」。衝突發生在 數據庫「DB_A14695_Elvinm」,表「dbo.AspNetUsers」,列'Id'。 聲明已被終止。

我用下面的類身份

public class ApplicationUser : IdentityUser 
{ 
    public int Type { get; set; } 
    public int Flags { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public DateTime LastModifiedDate { get; set; } 
} 

而且我的種子類

public class DbSeeder 
{ 
    #region Private Members 
    private RvMusicalDbContext DbContext; 
    private RoleManager<IdentityRole> RoleManager; 
    private UserManager<ApplicationUser> UserManager; 
    #endregion Private Members 

    #region Constructor 
    public DbSeeder(RvMusicalDbContext dbContext, RoleManager<IdentityRole> roleManager, UserManager<ApplicationUser> userManager) 
    { 
     DbContext = dbContext; 
     RoleManager = roleManager; 
     UserManager = userManager; 
    } 
    #endregion Constructor 

    #region Public Methods 
    public async Task SeedAsync() 
    { 
     // Create the Db if it doesn’t exist 
     DbContext.Database.EnsureCreated(); 
     // Create default Users 
     if (await DbContext.Users.CountAsync() == 0) await CreateUsersAsync(); 
    } 
    #endregion Public Methods 

    #region Seed Methods 
    private async Task CreateUsersAsync() 
    { 
     // local variables 
     DateTime createdDate = new DateTime(2016, 03, 01, 12, 30, 00); 
     DateTime lastModifiedDate = DateTime.Now; 
     string role_Administrators = "Administrators"; 
     string role_Registered = "Registered"; 

     //Create Roles (if they doesn't exist yet) 
     if (!await RoleManager.RoleExistsAsync(role_Administrators)) await RoleManager.CreateAsync(new IdentityRole(role_Administrators)); 
     if (!await RoleManager.RoleExistsAsync(role_Registered)) await RoleManager.CreateAsync(new IdentityRole(role_Registered)); 

     // Create the "Admin" ApplicationUser account (if it doesn't exist already) 
     var user_Admin = new ApplicationUser() 
     { 
      UserName = "Admin", 
      Email = "[email protected]", 
      CreatedDate = createdDate, 
      LastModifiedDate = lastModifiedDate, 
      Flags = 0, 
      Type = 0 
     }; 

     // Insert "Admin" into the Database and also assign the "Administrator" role to him. 
     if (await UserManager.FindByIdAsync(user_Admin.Id) == null) 
     { 
      await UserManager.CreateAsync(user_Admin, "Pass4Admin"); 
      /// ERROR OCCURED HERE 
      await UserManager.AddToRoleAsync(user_Admin, role_Administrators); 
      // Remove Lockout and E-Mail confirmation. 
      user_Admin.EmailConfirmed = true; 
      user_Admin.LockoutEnabled = false; 
     } 

    #endregion Seed Methods 


} 

我想說的是,角色保存的數據庫成功。

請幫忙解決問題。

+0

我不確定兩個示例邏輯之間是否存在差異。其次,我必須創建種子類,正如我上面所說的 –

回答

8

檢查UserManager.CreateAsync調用的錯誤之前正確的輸出。我猜你的用戶不會持續下去,因此下一次呼叫會因爲FK問題而失敗。

如果您使用的是默認身份密碼要求(就像我當我嘗試它時那樣),您會從用戶創建調用中獲得密碼驗證錯誤結果。

enter image description here

+0

我專注於異常,這與問題無關,在我的情況下是重複的用戶/電子郵件。謝謝你結束我的痛苦,戴夫。 – AndrewBenjamin

+0

我們都去過那裏。樂於幫助。 –

+0

這正是我的問題。在Entity Framework的以前版本中,可以有測試用戶密碼'Password1',但不在EF內核中。我非常肯定,創建一個沒有驗證結果的用戶。試過。這使我花費了大量的調試和搜索,因爲我還有其他與foreighn keys contstraints相沖突的問題。現在我知道它是,因爲我的用戶從來沒有創建過,所以在任何地方傳遞userid都會導致錯誤。 – Loki

0

如果您是確保admin用戶有一個ID

if (await UserManager.FindByIdAsync(user_Admin.Id) == null) 

應該

if (await UserManager.FindByIdAsync(user_Admin.Id) != null) 
+0

如果你看我的代碼,我添加await UserManager.CreateAsync(user_Admin,「Pass4Admin」);如果表情 –

+0

啊,是的,對不起,我看到了。你在哪裏設置ID?在您調用CreateAsync之後,user_admin是否有一個ID?您的錯誤意味着該ID不存在或其無效 – KevDevMan

相關問題