我认为就何时使用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;提到MyEntityA
或MyEntityB
?我认为它是前者。
如果这是正确的,那么您使用WithOptionalPrincipal
时的示例是什么?
我实际上在我的代码示例中认为它应该是WithMany
而不是WithOptional选项。显然,我仍感到困惑!
这两个函数都有重载,导航属性朝另一个方向发展。我认为那些超载不会改变这些答案,但如果我错了,请纠正我。
我希望这对更大的社区也有帮助。
答案 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();
MyEntityA
有FK
到MyEntityB
,因此在您的示例中,您配置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
表示依赖外键和导航属性。