EF Core数据播种报错:Federation实体因同主键已被跟踪如何解决
问题根因
- 你将
FName字段设置为了Federation实体的主键,主键要求全表唯一不可重复,但你在播种的AddRange方法中添加了两个FName = "UEFA"的实例,EF Core在追踪实体时检测到相同主键的多个实例,直接抛出冲突错误。 - 你的播种方法中同时调用了同步
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:如果业务允许存在多个同名联合会
调整实体结构,新增独立的主键字段,不要用名称作为主键即可:
- 修改模型:
public class Federation { // 新增自增主键 public int FedId { get; set; } public string FName { get; set; } }
- 修改实体配置:
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
相关产品推荐
相关产品推荐

