Entity Framework Core填充外键种子数据时出错求助
解决EF Core种子数据添加错误:实体类型'ProductInStock'导航属性冲突
错误信息
无法创建类型为''的'DbContext'。创建实例时抛出异常:“实体类型'ProductInStock'的种子实体无法添加,因为已设置导航属性'Product'。要配置关系,请将实体种子添加到'ProductInStock'并指定外键值{'ProductId'}。可考虑使用'DbContextOptionsBuilder.EnableSensitiveDataLogging'查看相关属性值。”
问题原因
ProductInStock实体的Product导航属性被默认实例化为new Product(),EF Core处理种子数据时,会误判你要通过导航属性创建新的Product实例,而非通过外键ProductId关联已存在的Product种子数据,从而触发冲突。
解决方案
1. 修改ProductInStock实体类
移除Product导航属性的默认实例化,改为以下两种方式之一:
方式一:使用可空导航属性
public class ProductInStock { public int Id { get; set; } public int ProductId { get; set; } public int Stock { get; set; } public virtual Product? Product { get; set; } }
方式二:保持非空但标记为非空断言(适合C# 8+)
public class ProductInStock { public int Id { get; set; } public int ProductId { get; set; } public int Stock { get; set; } public virtual Product Product { get; set; } = null!; }
2. 验证种子数据(无需修改)
你的ProductInStock种子数据仅设置了ProductId,未触碰Product导航属性,符合EF Core种子数据的要求,这部分代码保持原样即可:
modelBuilder .Entity<ProductInStock>() .HasData(Enumerable.Range(1, 100) .Select(index => new ProductInStock() { Id = index, ProductId = index, Stock = ramdom.Next(0, 100), }));
3. 重新生成迁移并更新数据库
执行以下命令重新生成迁移并应用到数据库:
# 生成新的迁移 Add-Migration FixSeedDataNavigationIssue # 更新数据库 Update-Database
原理说明
EF Core种子数据要求实体不能在构造时实例化导航属性,否则会被视为要创建关联实体的新实例。移除默认实例化后,EF会正确识别通过ProductId关联已存在的Product种子数据,避免导航属性冲突。
内容的提问来源于stack exchange,提问作者Miguel Macias
相关产品推荐
相关产品推荐

