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();
是指MyEntityA
或MyEntityB
的"正在配置的实体类型"?我认为是前者。
如果这是正确的,什么时候你会使用WithOptionalPrincipal
的例子?
我实际上认为在我的代码示例中,它应该是真正的WithMany
和WithOptional选项。显然我还是很困惑!
这两个函数都有重载,它们将导航属性向另一个方向移动。我认为这些重载不会改变这些答案,但如果我错了,请纠正我。
我希望这对更大的社区也有帮助。
例如,让我们修改你的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();
MyEntityA
有FK
到MyEntityB
,所以在你的例子中你配置MyEntityA
并使用WithOptionalDependent。但是你可以从MyEntityB
端开始配置,然后你需要WithOptionalPrincipal。
您的问题的答案是:"正在配置的实体类型"是MyEntityA
可以通过查看
的文档来明确地看到这一点OptionalNavigationPropertyConfiguration<TEntityType, TTargetEntityType>
是HasOptional
返回的类型,表示:
TTargetEntityType
关系目标的实体类型。
为短语提供了更多的上下文:
正在配置的实体类型
关系所针对的实体类型
在你的例子中你从HasOptional
和
OptionalNavigationPropertyConfiguration<MyEntityA, MyEntityB>
因此,WithOptionalDependent
意味着MyEntityB
将是主体,其可选的导航属性指向MyEntityA
(通过重载的lambda参数指定),MyEntityA
将是从属并包含外键和导航属性(如HasOptional
的lambda参数指定)。这是模型中的场景
相反,WithOptionalPrincipal
意味着MyEntityA
将是主体,而MyEntityB
将是具有外键和导航属性的从属。