C# Entity Framework Model First插入Identity列迁移报错求助
问题解决方法
报错原因
EF Core 的
HasData()种子数据方法要求所有实体的主键属性必须显式赋值,即使主键配置为自增标识列也不例外。这是因为EF生成迁移脚本时需要通过主键值判断种子数据是新增、修改还是删除,该规则和实际运行时数据库自增生成id的逻辑互不冲突。
解决步骤
- 给
HasData()方法内的EmpModel实体手动指定id值,按照报错提示使用负值即可,避免和后续数据库自动生成的正数值产生冲突 - 你现有代码中重复配置了主键和自增属性,可以直接删除冗余配置,模型类已经通过Attribute完成了相关声明
修改后代码
protected override void OnModelCreating(ModelBuilder builder) { EmployeeFile file = new EmployeeFile(); var response = file.GetData(); // 获取自定义数据 builder.Entity<EmpModel>().HasData( new EmpModel() { // 手动指定负值id,仅用于EF迁移阶段标识,不会实际存入数据库 id = -1, NPI = response.npiId, Name = response.FullName } ); // 以下两行配置和模型类的Attribute声明重复,可直接删除 // builder.Entity<EmpModel>().Property(p => p.id).ValueGeneratedOnAdd(); // builder.Entity<EmpModel>().HasKey(x => new { x.id}); }
补充说明
修改完成后重新执行 Add-Migration 命令即可正常生成迁移脚本,执行迁移后种子数据存入数据库时,SQL Server会自动生成identity标识列的正数值,你手动设置的负值仅用于迁移阶段的逻辑判断,不会实际写入数据库表。
内容的提问来源于stack exchange,提问作者Amar
相关产品推荐
相关产品推荐

