Asp.net核心标识"INSERT语句与FOREIGN KEY约束冲突"

Elv*_*dov 1 c# asp.net-mvc seeding asp.net-identity entity-framework-core

我使用ASP.NET CORE Identity创建ASP.NET CORE应用程序.我创建了种子类,用于为第一个启动应用程序保存新用户和角色.在这个种子类中,当我向用户添加角色时,我会收到以下错误.

INSERT语句与FOREIGN KEY约束"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; }
}
Run Code Online (Sandbox Code Playgroud)

还有我的种子班

 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 = "admin@opengamelist.com",
            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


}
Run Code Online (Sandbox Code Playgroud)

我想说角色成功保存了数据库.

请帮忙解决问题.

Dav*_*ten 13

在错误发生之前检查UserManager.CreateAsync调用的输出.我猜你的用户没有被持久化,所以下一次调用失败并出现FK问题.

如果您使用的是默认身份密码要求(就像我在尝试时那样),您将从用户创建调用中获得密码验证错误结果.

在此输入图像描述

  • 这正是我的问题。在实体框架的早期版本中,可以使用测试用户密码“Password1”,但在 EF Core 中则不行。我在创建用户时非常确定没有验证结果。成功。这花费了我大量的调试和谷歌搜索,因为我遇到了与外键约束冲突相关的其他问题。现在我知道是这样,因为我的用户从未创建过,所以在任何地方传递 userid 都会导致错误。 (2认同)