You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core执行Add-Migration报错:AdditionalProductSubType种子实体重复

EF Core Add-Migration 报错:检测到重复种子实体

问题描述

执行Add-Migration命令时失败,报错如下:

System.AggregateException: 发生一个或多个错误。(无法添加实体类型'AdditionalProductSubType'的种子实体,因为已添加了键值为'Id:1'的另一个种子实体。)
System.InvalidOperationException: 无法添加实体类型'AdditionalProductSubType'的种子实体,因为已添加了键值为'Id:1'的另一个种子实体。

已确认当前种子数据中无重复Id,但生成迁移时仍触发该错误。

相关代码与配置

种子数据配置类

public class AdditionalProductSubTypeSeed : IEntityTypeConfiguration<AdditionalProductSubType>
{
    public void Configure(EntityTypeBuilder<AdditionalProductSubType> builder)
    {
        builder.HasData(
            new AdditionalProductSubType { Id = 1, ParentTypeId = 4, TypeName = "Young Driver" },
            new AdditionalProductSubType { Id = 2, ParentTypeId = 4, TypeName = "Premium Location Fee" },
            new AdditionalProductSubType { Id = 3, ParentTypeId = 4, TypeName = "Out of Hours Fee" }
        );
    }
}

迁移文件相关代码

migrationBuilder.CreateTable(
    name: "ADDITIONALPRODUCTSUBTYPES",
    schema: "dbo",
    columns: table => new
    {
        ID = table.Column<int>(type: "int", nullable: false)
            .Annotation("SqlServer:Identity", "1, 1"),
        PARENTTYPEID = table.Column<int>(type: "int", nullable: false),
        TYPENAME = table.Column<string>(type: "nvarchar(max)", nullable: false)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_ADDITIONALPRODUCTSUBTYPES", x => x.ID);
        table.ForeignKey(
            name: "FK_ADDITIONALPRODUCTSUBTYPES_ADDITIONALPRODUCTTYPE_PARENTTYPEID",
            column: x => x.PARENTTYPEID,
            principalSchema: "dbo",
            principalTable: "ADDITIONALPRODUCTTYPE",
            principalColumn: "Id");
    });

migrationBuilder.InsertData(
    schema: "dbo",
    table: "ADDITIONALPRODUCTSUBTYPES",
    columns: new[] { "ID", "PARENTTYPEID", "TYPENAME" },
    values: new object[,]
    {
        { 1, 4, "Young Driver" },
        { 2, 4, "Premium Location Fee" },
        { 3, 4, "Out of Hours Fee" }
    });

环境信息

  • EF Core版本:7.0
  • 数据库:SQL Server
  • 开发环境:Windows 10, .NET 7

已尝试操作

  • 验证种子数据中无重复Id值
  • 检查所有先前迁移文件,未发现该表的重复种子数据
  • 检查AppDbContextModelSnapshot文件,未发现重复种子数据

可能原因与解决方案

1. 种子数据配置被重复应用

EF Core的HasData会累积所有注册的种子数据,如果同一实体的种子数据被多次添加(比如配置类被重复应用),就会触发重复键错误。

解决方案:

  • 检查DbContext的OnModelCreating方法,确保AdditionalProductSubTypeSeed只被应用一次:
    • 如果使用了modelBuilder.ApplyConfigurationsFromAssembly(...)批量加载配置类,不要再手动调用modelBuilder.ApplyConfiguration<AdditionalProductSubType>(new AdditionalProductSubTypeSeed())
    • 排查是否有其他代码路径重复注册了该实体的种子数据(比如直接在OnModelCreating中调用builder.Entity<AdditionalProductSubType>().HasData(...))

2. 模型快照文件隐藏残留

即使表面检查快照文件无重复,也可能存在EF Core模型缓存或快照文件未正确更新的情况。

解决方案:

  • 手动打开AppDbContextModelSnapshot.cs,搜索AdditionalProductSubType相关的种子数据配置,确认是否有重复的HasData条目,若有则删除重复项
  • 删除当前生成失败的迁移文件,清理项目的bin/obj目录,重新执行Add-Migration

3. 实体主键映射歧义

虽然迁移代码中已设置ID为主键,但需确认实体类AdditionalProductSubType的主键配置是否正确,避免EF Core误判种子数据的唯一键。

解决方案:

  • 检查实体类AdditionalProductSubType,确保Id属性被正确标记为主键(比如用[Key]特性,或在配置类中显式设置builder.HasKey(x => x.Id))
  • 确认实体属性与数据库列的映射无冲突(比如Id是否正确映射到数据库的ID列)

4. 迁移历史残留

如果之前曾对该表执行过迁移并回滚,可能存在迁移历史表中残留的记录干扰当前模型对比逻辑。

解决方案:

  • 若尚未将迁移应用到生产数据库,可删除迁移历史表(__EFMigrationsHistory)中相关条目,然后删除所有本地迁移文件,重新从初始状态生成迁移

内容的提问来源于stack exchange,提问作者A.A.T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:43:16