WithOptionalDependent vs WithOptionalPrinciple -明确的答案

本文关键字:答案 vs WithOptionalPrinciple WithOptionalDependent | 更新日期: 2023-09-27 18:02:20

我认为何时使用WithOptionalDependent和何时使用WithOptionalPrincipal的明确答案可能会有所帮助。这两个函数的帮助有点不清楚,我发现自己挖掘了多个Stack Overflow答案和其他网站上的答案,以便确信我已经将关系朝着正确的方向发展。

以下是MSDN对WithOptionalDependent的评论:

将关系配置为可选:可选,不带关系另一侧的Navigation属性。实体被配置的类型将是从属的,并且包含一个外键致校长。关系所针对的实体类型做关系的主体。

,这是它说的WithOptionalPrincipal:

将关系配置为可选:可选,不带关系另一侧的Navigation属性。实体被配置的类型将是关系中的主体。的关系目标的实体类型将是依赖的和包含主体的外键。

"正在配置的实体类型"这一行总是让我感到困惑(我想其他人也是如此)。

在这个例子中:

class MyEntityA
{
    [Key]
    public int Id { get; set; }
    public int BId { get; set; }
    [ForeignKey("BId")]
    public MyEntityB B { get; set; }
}
class MyEntityB
{
    [Key]
    public int Id { get; set; }
}
modelBuilder.Entity<MyEntityA>().HasOptional(a => a.B).WithOptionalDependent();

是指MyEntityAMyEntityB的"正在配置的实体类型"?我认为是前者。

如果这是正确的,什么时候你会使用WithOptionalPrincipal的例子?

我实际上认为在我的代码示例中,它应该是真正的WithMany和WithOptional选项。显然我还是很困惑!

这两个函数都有重载,它们将导航属性向另一个方向移动。我认为这些重载不会改变这些答案,但如果我错了,请纠正我。

我希望这对更大的社区也有帮助。

WithOptionalDependent vs WithOptionalPrinciple -明确的答案

例如,让我们修改你的EntityB by navigation属性,并使BId为空(因为我们正在谈论可选关系)。

class MyEntityA
{
    [Key]
    public int Id { get; set; }
    public int? BId { get; set; }
    [ForeignKey("BId")]
    public virtual MyEntityB B { get; set; }
}
class MyEntityB
{
    [Key]
    public int Id { get; set; }
    public virtual MyEntityA A { get; set; }
}

,则可以使用:

modelBuilder.Entity<MyEntityB>().HasOptional(a => a.A).WithOptionalPrincipal();

MyEntityAFKMyEntityB,所以在你的例子中你配置MyEntityA并使用WithOptionalDependent。但是你可以从MyEntityB端开始配置,然后你需要WithOptionalPrincipal。

您的问题的答案是:"正在配置的实体类型"是MyEntityA

可以通过查看

的文档来明确地看到这一点
OptionalNavigationPropertyConfiguration<TEntityType, TTargetEntityType>

HasOptional返回的类型,表示:

TTargetEntityType

关系目标的实体类型。

为短语提供了更多的上下文:

正在配置的实体类型

关系所针对的实体类型

在你的例子中你从HasOptional

返回
OptionalNavigationPropertyConfiguration<MyEntityA, MyEntityB>

因此,WithOptionalDependent意味着MyEntityB将是主体,其可选的导航属性指向MyEntityA(通过重载的lambda参数指定),MyEntityA将是从属并包含外键和导航属性(如HasOptional的lambda参数指定)。这是模型中的场景

相反,WithOptionalPrincipal意味着MyEntityA将是主体,而MyEntityB将是具有外键和导航属性的从属。