【问题标题】:WithOptionalDependent vs WithOptionalPrinciple - Definitive Answer?WithOptionalDependent vs WithOptionalPrinciple - 明确的答案?
【发布时间】:2014-06-26 05:35:47
【问题描述】:

我认为获得关于何时使用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();

“正在配置的实体类型”是指MyEntityA 还是MyEntityB?我认为是前者。

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

我实际上认为在我的代码示例中它应该真的是 WithMany 并且两者都不是 WithOptional 选项。显然我还是一头雾水!

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

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

【问题讨论】:

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


    【解决方案1】:

    例如,让我们通过导航属性修改您的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 具有FKMyEntityB,因此在您的示例中,您配置MyEntityA 并使用WithOptionalDependent。但是你可以从MyEntityB-side 开始配置,那么你需要WithOptionalPrincipal。

    【讨论】:

      【解决方案2】:

      您的问题的答案是:“正在配置的实体类型”是MyEntityA

      这可以通过查看documentation 来明确看出

      OptionalNavigationPropertyConfiguration<TEntityType, TTargetEntityType>
      

      这是HasOptional返回的类型,它说:

      TTargetEntityType

      关系所针对的实体类型。

      为短语提供更多上下文:

      正在配置的实体类型

      关系所针对的实体类型

      所以,在你的情况下,你从HasOptional 回来

      OptionalNavigationPropertyConfiguration<MyEntityA, MyEntityB>
      

      因此,WithOptionalDependent 意味着 MyEntityB 将是具有 可选 导航属性的 Principal 指向 MyEntityA(通过重载的 lambda 参数指定),MyEntityA 将是依赖并包含外键和导航属性(在 HasOptional 的 lambda 参数中指定)。 这是您模型中的场景。

      相反,WithOptionalPrincipal 表示 MyEntityA 将是主体,MyEntityB 是具有外键和导航属性的从​​属。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 2014-12-28
        • 2017-09-05
        • 2018-06-28
        • 2022-11-13
        • 1970-01-01
        相关资源
        最近更新 更多