You need to enable JavaScript to run this app. ASP.NET Core EF Core如何获取Guid主键并赋值给关联表外键字段
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core EF Core如何获取Guid主键并赋值给关联表外键字段

问题原因

你当前触发外键约束错误的核心原因是:LoaiDichVu和DichVu的主键、外键值都是调用Guid.NewGuid()即时生成的,两个值没有任何关联,DichVu的外键指向了一个不存在的LoaiDichVu主键值,自然违反外键约束。

解决方法

EF Core的HasData种子数据方法要求必须显式指定关联字段的值,不支持通过导航属性自动匹配主键外键,你只需要提前固定主表数据的ID,再复用给关联的从表外键即可:

修改后的Seed代码

public static class ModelBuilderExtensions
{
    public static void Seed(this ModelBuilder modelBuilder)
    {
        // 提前定义主表数据,使用固定Guid(可以自己生成一次后硬编码即可,保证唯一就行)
        var loaiDichVuEat = new LoaiDichVu() 
        { 
            ID = Guid.Parse("63763eb2-e537-4b97-a394-0529d216aa74"), 
            tenLoaiDichVu = "Eat",
            // 补全所有非空字段,避免插入报错
            moTa = "餐饮类服务",
            trangThai = "启用"
        };

        // 插入主表数据
        modelBuilder.Entity<LoaiDichVu>().HasData(loaiDichVuEat);

        // 从表外键直接复用上面主表的ID
        modelBuilder.Entity<DichVu>().HasData(
                new DichVu() 
                { 
                    ID = Guid.Parse("替换为你自己生成的固定Guid"),
                    ID_LoaiDichVu = loaiDichVuEat.ID,
                    tenDichVu = "米饭", 
                    donGia = 99,
                    // 补全所有非空字段
                    donViTinh = "份",
                    donViTien = "VND",
                    trangThai = "启用"
                }
               );
    }
}

注意事项

  • 所有种子数据的主键都建议使用固定Guid,不要用Guid.NewGuid(),否则你每次添加迁移的时候,EF都会识别为新数据,生成重复的插入语句,导致迁移文件冗余混乱。你可以通过VS工具、在线Guid生成器随便生成一批唯一值,硬编码到代码里即可。
  • 实体类中所有没有标记为可空的字段,在种子数据里都要赋值,否则会触发数据库非空约束报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 22:45:08