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

EF Core 2.1 Preview 2 HasData种子数据报错:缺少必填ID属性值

解决EF Core 2.1 Preview 2中HasData种子数据的必填ID属性报错问题

我之前在EF Core 2.x版本里刚好踩过这个坑,其实问题根源很明确:你把TenantID配置成了SQL Server的自增列(UseSqlServerIdentityColumn()),但在种子数据里没明确指定这个主键的值,EF Core的种子数据校验机制会认定必填的主键属性缺失值,所以抛出了这个错误。

为什么会出现这个问题?

当你设置主键为自增列后,EF Core默认会认为这个值由数据库自动生成,但种子数据的逻辑不一样——迁移时EF要生成INSERT语句直接插入数据到数据库,这时候如果不给主键值,EF的校验环节就会判定“必填属性未赋值”,哪怕数据库本身能自动生成这个值也不行。

解决方案:显式指定种子数据的主键值

最简单也最靠谱的解决方法,就是在HasData里给每一条种子数据明确指定TenantID的值,示例代码如下:

modelBuilder.Entity<Tenant>(e => {
    e.HasKey(m => m.TenantID).HasName("PK_Tenants");
    e.Property(m => m.TenantID).UseSqlServerIdentityColumn();
    // 显式指定ID值的种子数据
    e.HasData(
        new Tenant { TenantID = 1, Name = "默认租户" },
        new Tenant { TenantID = 2, Name = "测试租户" }
    );
});

你完全不用担心手动指定ID会影响后续的自增逻辑:EF Core在执行迁移时,会自动开启SQL Server的IDENTITY_INSERT开关,插入完种子数据后再关闭它。这样既保证了种子数据的ID符合你的预期,后续新增的租户数据依然会自动生成自增的ID值。

额外说明

如果实在不想手动指定ID值,那只能取消UseSqlServerIdentityColumn()的配置,让TenantID不再是自增列,但这通常不符合业务场景,所以更推荐上面的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:34:02