EF:我应该在我的实体中包含外键id吗?

本文关键字:包含外 id 实体 我应该 我的 EF | 更新日期: 2023-09-27 18:03:55

我知道EF约定并没有明确要求它们,但在实际开发中,我发现能够简单地更新实体外键而不是附加相关实体是非常有用的。我的感觉是最好有两个可用的选项,这样任何一个都可以在给定的使用上下文中使用,但是感觉就像我用属性污染了我的POCO,这些属性更像是数据库构造而不是OO构造。

希望得到专业人士的意见。

不带外键

public class ProductGroup
{
    public int ProductGroupID { get; set; }
    public string Name { get; set; }
    //Navigation Properties
    public virtual System_ProductGroup System_ProductGroup { get; set; }
    public virtual ICollection<ProductSubGroup> ProductSubGroups { get; set; }
    public virtual ProductSection ProductSection { get; set; }
    public virtual ICollection<GeneralTranslation> GeneralDescriptionTranslations { get; set; }
}

带外键

public class ProductGroup
{
    public int ProductGroupID { get; set; }
    public string Name { get; set; }
    //Foreign Keys
    public int System_ProductGroupID { get; set; }
    public int ProductSectionID { get; set; }
    //Navigation Properties
    public virtual System_ProductGroup System_ProductGroup { get; set; }
    public virtual ICollection<ProductSubGroup> ProductSubGroups { get; set; }
    public virtual ProductSection ProductSection { get; set; }
    public virtual ICollection<GeneralTranslation> GeneralDescriptionTranslations { get; set; }
}

EF:我应该在我的实体中包含外键id吗?

恕我直言,在某些情况下最好避免包括外键,前提是您已经拥有了这些键作为属性引用的virtual实体,并且您没有延迟加载。如果您已经拥有这些属性,那么外键只是可以从virtual实体本身抓取的冗余数据。

在一天结束时,外键意味着将您链接到其他实体,并且,正如您所说,它们更像是一个数据库结构。作为开发人员,您知道virtual实体中的外键链接到哪个列,并且可以相应地访问该属性,因此从POCO实体中排除外键不会消除对该数据的访问。

对于@HiperiX的观点(在他的评论中),消除外键本身将因此消除延迟加载的能力。如果您打算对键执行某些逻辑,这些逻辑将决定是否抓取被引用的实体,那么包括外键将是一个好主意。我已经更新了我的帖子的措辞,以反映这一警告。

通常我尽量避免。外键的概念与关系数据库有关,即持久性级别。即使POCO专门用作DAO,我也更喜欢删除不必要的提醒,而不是底层技术。

但是有一个情况,当我发现它们很有用:当你想要的SomeCollection.Remove(x)删除也在数据库中。

在这种情况下,使用EF,您必须为收集的实体构建一个包含FK的复合PK。在这种情况下,你需要在POCO中添加FK

我认为在大多数情况下,这取决于个人喜好。因为我不仅要负责应用程序的开发,还要负责SSRS报告的开发。包括外键让我可以控制外键字段的名称,并有助于确保在编写查询时,我知道表是如何连接的。