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

EF Core数据播种报错:Federation实体因同主键已被跟踪如何解决

问题根因

  1. 你将FName字段设置为了Federation实体的主键,主键要求全表唯一不可重复,但你在播种的AddRange方法中添加了两个FName = "UEFA"的实例,EF Core在追踪实体时检测到相同主键的多个实例,直接抛出冲突错误。
  2. 你的播种方法中同时调用了同步SaveChanges()和异步SaveChangesAsync(),等于重复提交两次请求,就算数据没有重复也可能出现二次提交的主键冲突问题。

解决方案

方案1:如果业务要求联合会名称唯一(符合常规场景)

直接去重播种数据,同时删掉重复的提交代码即可,修改后的播种逻辑如下:

public static class SeedFederations
{        
    public static async Task SeedFederationsDataAsync(ApplicationDbContext context)
    {
        if (context.Federations.Any())
        {
            return;   // DB has been seeded
        }
        context.Federations.AddRange(
            new Federation { FName = "FIFA" },
            new Federation { FName = "UEFA" },
            new Federation { FName = "AFC" }
         );
        // 仅保留异步提交即可
        await context.SaveChangesAsync();
    }
}

方案2:如果业务允许存在多个同名联合会

调整实体结构,新增独立的主键字段,不要用名称作为主键即可:

  1. 修改模型:
public class Federation
{        
    // 新增自增主键
    public int FedId { get; set; }        
    public string FName { get; set; }        
}
  1. 修改实体配置:
public class FederationConfiguration : IEntityTypeConfiguration<Federation>
{        
    public void Configure(EntityTypeBuilder<Federation> builder)
    {
        // 切换主键为新增的独立字段
        builder.HasKey(t => t.FedId);
        builder.Property(t => t.FName)
            .HasMaxLength(20)
            .IsRequired();
    }
}

修改完成后执行数据库迁移更新表结构,再重新执行播种操作即可。


内容的提问来源于stack exchange,提问作者Nguyen Tuan Anh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:24:01