【问题标题】:SqlException: Violation of ****** constraint '******'. Cannot insert duplicate key in object '******'. The duplicate key value is ******SqlException:违反 ****** 约束“******”。无法在对象“******”中插入重复键。重复键值为 ******
【发布时间】:2018-07-22 17:51:37
【问题描述】:

尝试使用 EF 将用户插入 AspNetUsers 表时,出现以下错误:

Microsoft.EntityFrameworkCore.DbUpdateException: '发生错误 在更新条目时。有关详细信息,请参阅内部异常。'

SqlException:违反 ****** 约束“******”。无法插入 对象“******”中的重复键。重复键值为 ******。 声明已终止。

该错误是逐字记录的(它实际上显示了星号)。在插入用户之前,我明确删除了它们,所以我不知道为什么会出现这个错误。

删除用户的代码

            foreach (var user in globalUsers)
            {
                if (rdb.Users.Any(u => u.Email == user.Email))
                {
                    var existingUserInDb = rdb.Users.First(u => u.Email == user.Email);
                    rdb.Users.Remove(existingUserInDb);
                    await rdb.SaveChangesAsync();
                }
            }

添加新用户的代码

            foreach (var gu in globalUsers)
            {
                rdb.Users.Add(gu);
                await rdb.SaveChangesAsync();
            }

【问题讨论】:

  • 删除后有没有试过commit?这是因为您尝试了相同的主键插入。
  • 对于包含掩码值的异常,看看使用EnableSensitiveDataLogging方法是否有帮助。

标签: entity-framework asp.net-core ef-core-2.1


【解决方案1】:

问题如下:

  • 添加用户时,我已经明确设置了用户 ID
  • 我们使用的是软删除,因此删除现有用户实际上并没有删除它
  • ASP.NET/EF 没有读取软删除,因此我插入了另一个与软删除用户具有相同用户 ID 的用户

我通过在插入用户时创建一个新的用户 ID 解决了这个问题。

        foreach (var gu in globalUsers)
        {
            gu.Id = Guid.NewGuid().ToString();
            rdb.Users.Add(gu);
            await rdb.SaveChangesAsync();
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2021-05-08
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多