WithOptionalDependent与WithOptionalPrinciple - 最终答案?

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)

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

如果这是正确的,你什么时候使用的例子是什么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)

MyEntityAFKMyEntityB,所以在你的exapmle配置MyEntityA和使用WithOptionalDependent.但是你可以从MyEntityB-side 开始配置,然后你需要WithOptionalPrincipal.