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

时间:2014-05-16 16:09:46

标签: c# asp.net entity-framework

我知道EF惯例并没有明确要求,但在现实世界的开发中,我发现能够简单地更新实体外键非常有用,而不是附加相关的相关实体。我的感觉是,让两个选项都可用,以便可以在其中使用上下文中使用它们更好,但它只是感觉像是在污染我的POCO' s具有比OO构造更多的数据库构造的属性。

非常感谢Pro的想法。

没有外键

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; }
}

3 个答案:

答案 0 :(得分:1)

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

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

对于@ HiperiX的观点(在他的评论中),消除外键本身就会消除你的延迟加载能力。如果您要使用可确定是否获取引用实体的键来执行某些逻辑,那么包含外键将是一个好主意。我更新了我的帖子的措辞以反映这一警告。

答案 1 :(得分:1)

通常我会尽量避免。外键的概念与关系DB有关,即与持久性级别有关。即使将POCO专门用作DAO,我也更愿意将不必要的提醒删除到底层技术。

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

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

答案 2 :(得分:1)

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