我如何在EF 7流畅建模中表达这种一对一的关系
本文关键字:一对一 关系 建模 EF | 更新日期: 2023-09-27 18:02:59
我正试图将EF 6模型迁移到EF 7,但我被困在一点上。我已经尝试了好几个人的建议,但都无济于事。
这是EF 6中表示的属性:
modelBuilder.Entity<StockItem>()
.HasOptional(e => e.StockItemHolding)
.WithRequired(e => e.StockItem);
使用这样的代码,我得到以下错误:错误CS1061 'EntityTypeBuilder'不包含定义'HasOptional'并且没有扩展方法'HasOptional'接受类型为"EntityTypeBuilder"的第一个参数可以找到(您是否缺少using指令或程序集?参考?)
我已经检查了文档,WithRequired
是问题所在。它已经被WithOne
取代了。多对多关系可以很好地工作,就像下面这个:
modelBuilder.Entity<StockItem>()
.HasMany(e => e.StockItemTransactions)
.WithOne(e => e.StockItem).IsRequired()
.OnDelete(DeleteBehavior.Restrict);
在EF Core Fluent API中Required
/Optional
(以及Dependent
/Principal
)不再是Has
/With
方法的一部分。它们已被HasOne
/WithOne
和IsRequired
联合取代。
然而,关于EF Core中的one-to-one
关系,还有一些其他重要的细节。
IsRequired
只适用于依赖于的实体,即从主体端来看,该关系始终是可选的。第二,您需要指定依赖的外键,它可以是PK或单独的字段(显式或影子)。
因此,上述EF6配置(创建共享主键关联)的等效EF Core配置将是这样的(假设StockItemHolding
PK称为Id
):
modelBuilder.Entity<StockItem>()
.HasOne(e => e.StockItemHolding)
.WithOne(e => e.StockItem)
.HasForeignKey<StockItemHolding>(e => e.Id);