Asp.net core Identity “INSERT 语句与 FOREIGN KEY 约束冲突”

Posted

技术标签:

【中文标题】Asp.net core Identity “INSERT 语句与 FOREIGN KEY 约束冲突”【英文标题】:Asp.net core Identity "The INSERT statement conflicted with the FOREIGN KEY constraint " 【发布时间】:2017-05-07 21:56:07 【问题描述】:

我使用 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; 

还有我的种子类

 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



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

请帮忙解决问题。

【问题讨论】:

我不确定两个示例逻辑之间是否存在差异。其次,我必须创建种子类,正如我上面所说的 我也遇到了同样的问题,你是怎么解决的? 【参考方案1】:

我遇到了同样的问题。这就是解决方案;转到 DBContext 并删除继承类中的用户。

之前:

public class MyDBContext : IdentityDbContext<MyUser>
 

之后:

public class MyDBContext : IdentityDbContext
 

【讨论】:

【参考方案2】:

我知道这已经得到解答,但我只需要添加我的解决方案来解决我的问题,希望我可以拯救其他一些可怜的灵魂,以免重蹈我的覆辙.....

我的用户已创建...

我只是没有单击 SQL Server 对象资源管理器上的“刷新”按钮。

:(多么尴尬。我花了一个小时以上的时间来追踪这个。

编辑:我看到我投了反对票。我遇到了与提出问题的人相同的问题,我的解决方案是页面需要刷新。虽然这是一个愚蠢的错误,但通常可以安全地假设,当你犯错时,你不是唯一的。在用户没有刷新页面的所有情况下,我的答案都是正确的答案,我相信这是一个不错的答案。

【讨论】:

【参考方案3】:

在错误发生前检查 UserManager.CreateAsync 调用的输出。我猜您的用户没有得到持久化,因此下一次调用因 FK 问题而失败。

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

【讨论】:

我专注于异常,这与问题无关,在我的情况下是重复的用户/电子邮件。谢谢你结束我的痛苦,戴夫。 这正是我的问题。在 Entity Framework 的早期版本中,可以使用测试用户密码“Password1”,但在 EF Core 中则不行。在创建未验证结果的用户时,我非常确定。成功。这花费了我大量的调试和谷歌搜索,因为我有其他与外键约束冲突相关的问题。现在我知道是这样,因为我的用户从未被创建,所以在任何地方传递用户 ID 都会导致错误。 我收到了类似的错误,但它表示用户名和电子邮件无效。请看***.com/questions/55813937/… @ThadeuAntonioFerreiraMelo 看起来你已经整理好了。 :) 谢谢!我的第一个测试用户将 Null 作为电子邮件,所以我尝试创建的第二个用户有一个重复的 null 电子邮件。您的回答让我找到了问题所在。【参考方案4】:

您是否应该确保用户 admin 有一个 ID

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

应该是

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

【讨论】:

如果你看我的代码,我添加了 await UserManager.CreateAsync(user_Admin, "Pass4Admin"); if 表达式之后 啊,是的,对不起,我看到了。你在哪里设置ID?调用 CreateAsync 后,user_admin 是否有 Id?您的错误意味着 ID 不存在或它的 null

以上是关于Asp.net core Identity “INSERT 语句与 FOREIGN KEY 约束冲突”的主要内容,如果未能解决你的问题,请参考以下文章

“Identity.External”的 ASP.NET Core 标识异常

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色

Asp.Net Core 2.1 Identity - UserStore 依赖注入

ASP.NET Core Identity 系列之四

ASP.NET Core Identity - 扩展密码哈希