我知道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; }
}
答案 0 :(得分:1)
恕我直言,最好避免在某些情况下包含外键,前提是您已经拥有该键所指的virtual
实体作为属性,并且您不是延迟加载。如果您已经拥有这些属性,那么外键只是一个可以从virtual
实体本身获取的冗余数据。
在一天结束时,外键用于将您链接到其他实体,正如您所说,它们更像是一个数据库构造。作为开发人员,您知道外键在virtual
实体中链接到哪一列,并且您可以相应地访问该属性,因此从POCO实体中排除外键不会消除您对该数据的访问。
对于@ HiperiX的观点(在他的评论中),消除外键本身就会消除你的延迟加载能力。如果您要使用可确定是否获取引用实体的键来执行某些逻辑,那么包含外键将是一个好主意。我更新了我的帖子的措辞以反映这一警告。
答案 1 :(得分:1)
通常我会尽量避免。外键的概念与关系DB有关,即与持久性级别有关。即使将POCO专门用作DAO,我也更愿意将不必要的提醒删除到底层技术。
但是我发现它们很有用:当你想要SomeCollection.Remove(x)也在数据库中删除时。
在这种情况下,使用EF,您必须为收集的实体构建包含FK的复合PK。因此,在这种情况下,您需要POCO中的FK。
答案 2 :(得分:1)
我认为在大多数情况下,归结为个人偏好。我包含它们是因为我不仅负责应用程序的开发,还负责SSRS报告的开发。包括外键让我可以控制外键字段的名称,并有助于确保在编写查询时,我知道如何连接表。