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

EF Core种子数据用变量设置ID时出现重复键错误的问题

问题原因分析

你遇到的错误完全是变量使用逻辑问题,和EF Core规则无关:

  • 你先把ID变量设为1,创建实体数组时,所有对象的Id都直接使用了这个变量的当前值(1),此时所有实体的Id已经被固定为1。
  • 后续foreach循环里递增ID变量,只是改变了变量本身的值,并不会回溯修改已经创建好的实体的Id。
  • 循环调用.HasData()时,每次都是在添加Id=1的重复实体,触发EF Core种子数据的唯一键约束校验,自然报错。
正确实现方式

方案1:创建实体时直接生成连续ID(推荐)

不需要循环调用.HasData(),先通过循环创建所有带递增ID的实体,再一次性传入.HasData():

var startId = 1;
var sampleEntities = new List<MyEntity>();

for (var i = 0; i < 130; i++)
{
    sampleEntities.Add(new MyEntity
    {
        Id = startId++,
        // 填充其他属性,例如:
        // Name = $"示例实体 {i+1}",
        // Description = "这是批量生成的示例数据"
    });
}

// 一次性添加所有种子数据
modelBuilder.Entity<MyEntity>().HasData(sampleEntities);

方案2:利用LINQ生成实体集合

如果喜欢更简洁的写法,也可以用LINQ生成:

var sampleEntities = Enumerable.Range(1, 130)
    .Select(id => new MyEntity
    {
        Id = id,
        // 其他属性赋值
    })
    .ToList();

modelBuilder.Entity<MyEntity>().HasData(sampleEntities);

注意事项

  • 不要多次调用.HasData(),EF Core会将每次调用的实体都加入种子数据集合,容易导致重复或混乱;一次性传入所有实体是更规范的做法。
  • 如果你的实体ID是数据库自增列([DatabaseGenerated(DatabaseGeneratedOption.Identity)]),理论上可以不指定ID,但种子数据中不指定ID可能导致后续迁移时的ID不可控,批量示例数据建议手动指定连续ID更稳妥。

内容的提问来源于stack exchange,提问作者dustylamborghini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:39:32