在IEntityTypeConfiguration<T>的Configure方法中如何为种子数据关联实体?
解决方案
核心思路是固定Owner的主键Id值,不能用Guid.NewGuid()动态生成,否则每次加载配置类Owner的Id都会变化,Account无法匹配到对应的外键值。
步骤1:预定义固定的Owner主键值
你可以把种子数据用到的固定Id抽成公共静态变量,方便两个配置类共用,示例如下:
// 专门存放种子数据固定值的公共静态类(也可以直接写在OwnerConfiguration里) public static class SeedDataConsts { // 你可以自己生成一个固定的Guid值,这里只是示例 public static readonly Guid OwnerAId = new Guid("62FA647C-AD54-4BCC-A860-E5A2664B019D"); }
步骤2:修改Owner配置类,使用固定Id
public class OwnerConfiguration : IEntityTypeConfiguration<Owner> { public void Configure(EntityTypeBuilder<Owner> builder) { builder.HasData ( new Owner { Id = SeedDataConsts.OwnerAId, // 使用固定Id Name = "Owner A", Address = "Address A" } ); } }
步骤3:修改Account配置类,直接给OwnerId赋固定值
EF Core的种子数据关联不需要赋值导航属性,只需要外键字段和关联的主键值一致即可:
public class AccountConfiguration : IEntityTypeConfiguration<Account> { public void Configure(EntityTypeBuilder<Account> builder) { builder.HasData ( new Account { Id = Guid.NewGuid(), // Account的Id如果不需要固定也可以动态生成,建议也用固定值避免重复生成 DateCreated = new DateTime(2024,1,1), // 建议用固定时间,避免每次迁移都检测到数据变化 AccountType = "I", OwnerId = SeedDataConsts.OwnerAId // 直接关联Owner A的固定Id }, new Account { Id = Guid.NewGuid(), DateCreated = new DateTime(2024,1,2), AccountType = "II", OwnerId = SeedDataConsts.OwnerAId } ); } }
注意:如果你不想单独抽公共静态类,只要保证Owner的Id和Account的OwnerId写的是同一个固定Guid字符串也可以正常生效,抽成公共变量只是为了方便后续维护,避免写错。
内容的提问来源于stack exchange,提问作者craig
相关产品推荐
相关产品推荐

