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
相关产品推荐
相关产品推荐

