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

Entity Framework 5 数据种子化时自增列使用及报错解决咨询

问题根因

EF Core 的 HasData() 种子数据方法要求必须为自增主键显式提供固定值,即便你已经配置了主键自动生成规则,迁移生成阶段也不会自动为种子数据生成主键值,这个设计是为了保证迁移的可复现性,方便后续更新种子数据时精准匹配对应行。

解决方案

在种子数据中显式为 ObjectClassId 赋值即可,按照错误提示优先使用负值,避免和后续正常插入的正整数自增ID冲突,修改后的配置代码如下:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ObjectClass>(b =>
        {
            b.HasKey(e => e.ObjectClassId);
            b.Property(e => e.ObjectClassId).ValueGeneratedOnAdd().UseIdentityColumn(0, 1);

            b.HasData(
                new ObjectClass
                {
                    ObjectClassId = -1, // 显式赋值唯一负值主键
                    ObjectClassTitle = "Object",
                    ObjectClassDescription = "Root object",
                    OfType = 1
                },
                new ObjectClass
                {
                    ObjectClassId = -2, // 每个种子数据主键唯一即可
                    ObjectClassTitle = "Object",
                    ObjectClassDescription = "Root object",
                    OfType = 1
                }
            );
        });
}

补充说明

  • 你配置的 UseIdentityColumn(0, 1) 规则不会受影响,后续运行时插入的普通数据自增ID会从1开始递增,不会和种子数据的负值ID冲突
  • 后续如果需要新增/修改/删除种子数据,只要保持对应行的主键值固定,EF迁移就能自动识别变更生成对应的SQL语句
  • 你贴出的第一个实体类为 ObjectInstance,和当前配置的 ObjectClass 不是同一个实体,只要你在 ObjectClass 中定义了 ObjectClassId 主键属性,现有Fluent API的配置就可以保证运行时普通数据的主键自动生成逻辑正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:24:03