WithOptionalDependent与WithOptionalPrinciple - 最终答案?

时间:2014-05-08 17:12:13

标签: c# entity-framework ef-code-first

我认为就何时使用WithOptionalDependent以及何时使用WithOptionalPrincipal获得明确答案可能会有所帮助。这两个函数的帮助有点不清楚,我发现自己正在挖掘其他网站上的多个Stack Overflow答案和答案,结合答案,以确信我的关系是正确的方向。

以下是MSDN对WithOptionalDependent所说的内容:

  

将关系配置为可选:可选,不带a   关系另一边的导航属性。实体   正在配置的类型将是依赖类型并包含外键   到校长。关系所针对的实体类型   是这段关系中的主体。

以下是关于WithOptionalPrincipal的说法:

  

将关系配置为可选:可选,不带a   关系另一边的导航属性。实体   正在配置的类型将是关系中的主体。该   关系目标的实体类型将是依赖和   包含校长的外键。

该行"正在配置的实体类型"总是让我困惑的部分(我假设其他人)。

在这个例子中:

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();

是&#34;正在配置的实体类型&#34;提到MyEntityAMyEntityB?我认为它是前者。

如果这是正确的,那么您使用WithOptionalPrincipal时的示例是什么?

我实际上在我的代码示例中认为它应该是WithMany而不是WithOptional选项。显然,我仍感到困惑!

这两个函数都有重载,导航属性朝另一个方向发展。我认为那些超载不会改变这些答案,但如果我错了,请纠正我。

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

2 个答案:

答案 0 :(得分:14)

例如,让我们通过导航属性修改您的EntityB并使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。

答案 1 :(得分:4)

您的问题的答案是:&#34;正在配置的实体类型&#34;是MyEntityA

通过查看documentation

,可以明确看出这一点
OptionalNavigationPropertyConfiguration<TEntityType, TTargetEntityType>

这是HasOptional返回的类型,其中包含:

  

TTargetEntityType

     

关系所针对的实体类型。

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

  

正在配置的实体类型

     

关系所针对的实体类型

因此,在您的情况下,您将从HasOptional

返回
OptionalNavigationPropertyConfiguration<MyEntityA, MyEntityB>

因此,WithOptionalDependent表示MyEntityB将是可选导航属性指向MyEntityA的主体(通过重载指定) lambda参数)和MyEntityA将是Dependent并包含一个外键和导航属性(在HasOptional的lambda参数中指定)。 这是您模型中的方案。

相反,WithOptionalPrincipal表示MyEntityA将成为Principal,MyEntityB表示依赖外键和导航属性。