Tim*_*Tim 46 c# entity-framework ef-code-first
我认为在何时使用WithOptionalDependent以及何时使用时获得明确的答案可能会有所帮助WithOptionalPrincipal.这两个函数的帮助有点不清楚,我发现自己正在挖掘其他网站上的多个Stack Overflow答案和答案,结合答案,以确信我的关系是正确的方向.
以下是MSDN所说的内容WithOptionalDependent:
将关系配置为可选:在关系的另一侧没有导航属性的可选.正在配置的实体类型将是依赖项,并包含主体的外键.关系所针对的实体类型将是关系中的主体.
以下是它所说的内容WithOptionalPrincipal:
将关系配置为可选:在关系的另一侧没有导航属性的可选.正在配置的实体类型将是关系中的主体.关系所针对的实体类型将是依赖的实体类型,并包含主体的外键.
"正在配置的实体类型"这一行总是让我困惑(我假设其他人).
在这个例子中:
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();
Run Code Online (Sandbox Code Playgroud)
是"正在配置的实体类型"是指MyEntityA或MyEntityB?我认为它是前者.
如果这是正确的,你什么时候使用的例子是什么WithOptionalPrincipal?
我实际上在我的代码示例中认为它应该是,WithMany而不是WithOptional选项.显然我还是很困惑!
这两个函数都有重载,导航属性朝另一个方向发展.我认为那些重载不会改变那些答案,但如果我错了,请纠正我.
我希望这对更大的社区也有帮助.
小智 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; }
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用:
modelBuilder.Entity<MyEntityB>().HasOptional(a => a.A).WithOptionalPrincipal();
Run Code Online (Sandbox Code Playgroud)
MyEntityA有FK来MyEntityB,所以在你的exapmle配置MyEntityA和使用WithOptionalDependent.但是你可以从MyEntityB-side 开始配置,然后你需要WithOptionalPrincipal.