【问题标题】:Microsoft Entity Framework Core: Cannot insert duplicate key in objectMicrosoft Entity Framework Core:无法在对象中插入重复键
【发布时间】:2019-03-08 20:50:12
【问题描述】:

我正在尝试使用子实体 GuildMember、Team 和 GuildMemberChallenge 更新父实体 GuildMemberTeam,它也有子实体 GuildMember 和 Challenge,但出现以下内部异常:

内部异常1:SqlException:违反PRIMARY KEY约束 'PK_挑战'。无法在对象“dbo.Challenge”中插入重复键。 重复键值为 (15ae8798-8567-457b-812a-5820cf7843e5)。这 语句已终止。

唯一的新实体是 GuildMemberTeam,因为所有其他实体都已经存在,但这些都被检查并重新创建如下:

public void AddChallenge(Challenge challenge)
{
    if (challenge != null)
    {
        var id = challenge.Id == default(Guid) ? Guid.NewGuid() : challenge.Id;

        Challenge = new Challenge(id, challenge.Name, challenge.Phase, challenge.Type, challenge.Star, challenge.Gear, challenge.Level, challenge.Reward);
    }
}

这适用于我收到错误的挑战之外的所有其他实体。谁能帮我理解我做错了什么。

【问题讨论】:

  • 您正在尝试插入一个新行,其 ID 已存在于数据库中。默认(指导)? Guid.NewGuid() : 挑战.Id;
  • Kristof - 我知道我正在这样做,但我正在对所有其他实体这样做,这很好,只是在这个子实体上

标签: c# sql entity-framework-core


【解决方案1】:

这并没有改变这样一个事实,即问题在于您尝试将同一行两次(相同的 Guid=Id)插入到 dbo.Challenge 表中。

  1. 这可能是由于调试问题或其他原因。您可以使用删除表中的行 DELETE FROM [Challenge] WHERE Id = '15ae8798-8567-457b-812a-5820cf7843e5' 并尝试再次运行该应用。

  2. 如果这不能解决您的问题,您的实体管理有问题,您必须修改 ID 处理。在尝试保存上下文或类似内容之前实施 ID 检查。

另一个问题可能是您的类没有正确定义并且 EF 无法识别这些关系。你所说的关系不是父子关系,它们要么是一对多、多对多、多对一,要么没有。 DB RELATIONS

你的每个 POCO-s 都应该包含另一个类的实例,因此你定义了一个关系。例如。如果您的 GuildMemberChallenge 包含一个 IEnumerable 和一个具有挑战类型的属性。

如果以上都不是解决方案,我需要更多代码(您的类、存储库)来解决。

更新: 当您添加新的 GuildMemberChallenge 时,我假设您现在正在尝试这样做。如果存在,则应将其 Challenge 属性设置为现有实体,如果不存在,则可以创建一个,但此时您正在尝试创建数据库中已存在的 Challenge。

【讨论】:

    【解决方案2】:

    您正在创建新挑战,但如果设置了现有挑战,则传递现有挑战的 id。

    var id = challenge.Id == default(Guid) ? Guid.NewGuid() : challenge.Id;
    

    我认为你,如果你创建新实体,你应该总是创建新的 Id

    var id = Guid.NewGuid();
    

    【讨论】:

    • 我不希望挑战实体改变,它只是一个子实体
    • 那你为什么要创造全新的挑战呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多