我如何在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 7流畅建模中表达这种一对一的关系

在EF Core Fluent API中Required/Optional(以及Dependent/Principal)不再是Has/With方法的一部分。它们已被HasOne/WithOneIsRequired联合取代。

然而,关于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);