1

ASP.NET CORE IDを使用してASP.NET COREアプリケーションを作成します。 最初の起動アプリケーション用の新しいユーザーとロールを保存するためのシードクラスを作成します。このシードクラスの内部では、ロールをユーザーに追加するとエラーが発生します。Asp.net core Identity "INSERTステートメントがFOREIGN KEY制約と競合しました"

FOREIGN KEY制約 "FK_AspNetUserRoles_AspNetUsers_UserId" と競合INSERT文。競合は、 データベース "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

私は2つの例ロジック間の差があることを確認していません。第二に、上記のようにシードクラスを作成する必要があります –

答えて

8

する必要がありますIDは、右のエラーが発生する前UserManager.CreateAsync呼び出しの出力を確認しました。私はあなたのユーザーが次の呼び出しがFK問題で失敗するように持続されないと推測しています。

デフォルトアイデンティティのパスワード要件(私が試したときのような)を使用している場合は、ユーザー作成の呼び出しでパスワードの検証エラーが発生します。

enter image description here

+0

私は例外に焦点を当てました。私の場合は重複したユーザ/電子メールだった問題とは関係ありません。私の不幸を終わらせてくれてありがとう、Dave。 – AndrewBenjamin

+0

私たちはすべてそこに行ってきました。お力になれて、嬉しいです。 –

+0

それはまさに私の問題でした。 Entity Frameworkの以前のバージョンでは、テストユーザーのパスワード 'Password1'を持つことはできましたが、EFコアにはありませんでした。私は結果を確認していないユーザーを作成している間、とても確信していました。 foreighnキーcontstraintsに矛盾する他の問題があったので、それは私に多くのデバッグとグーグルを要しました。今私は、私のユーザーは決して作成されていないので、どこでもuseridを渡すとエラーが発生したことを知っています。 – Loki

0

あなたはユーザーadminを確保するべき

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

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

私のコードを見れば、私はUserManager.CreateAsync(user_Admin、 "Pass4Admin");その後の表現 –

+0

ああ、申し訳ありませんが、私はそれを参照してください。あなたはIDをどこに設定していますか? CreateAsyncを呼び出した後にuser_adminにIdがありますか?あなたのエラーは、IDが存在しないことを意味するか、そのヌルです – KevDevMan

関連する問題