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