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

