EF6表拆分与多个拆分的共享主键



我正在将一个遗留数据库系统升级到.NET+实体框架6(代码优先的POCO)+PostgreSQL。为了便于编程,我希望将一个大表(200多个字段)拆分为多个实体,例如:

Franchise
FranchiseLegalEntity
FranchiseBilling
FranchiseSignup
FranchiseAllocation
FranchiseCompliance
FranchiseMiscellaneous
FranchiseNotifications

我很高兴发现EF6支持"表拆分":将一个表映射到多个实体以拆分字段。

然而,尝试实现这一点,并在网上阅读了许多页面,证实了在多次拆分时这是有问题的。实体框架不仅需要指向主体实体的导航属性,还需要映射到表的所有实体之间的导航属性。对于我上面的场景,这将需要21个毫无意义的导航属性——如果我让它们成为双向的,则需要42个。

请参阅:http://social.msdn.microsoft.com/Forums/en-US/0f65caae-8a66-431f-aa02-4b2c68f871e9/ef-41-rc-code-first-split-one-table-into-multiple-entities?forum=adodotnetentityframework

请参阅:如何使用EF Code First 将大表分离为多个离散类型

建议使用带有共享主键的多个表,这对我来说是一个选项。然而,考虑到EF庞大的SQL查询生成,以及PostgreSQL有时对复杂查询的随意查询优化器,我担心这个选项(100GB+数据库)的性能。

总结:

表格拆分

优点:最佳查询性能,在数据库层实现最快

缺点:用垃圾污染我的模型和OnModelBuild()方法,混淆其他开发人员

跨多个表共享主键

优点:最干净的模型和;代码,非遗留数据库的推荐解决方案

缺点:实施额外的工作,可能会降低的性能

我的问题:

1) EF6是否通过2+拆分改进了表拆分?

2) 有什么我没有考虑的因素吗?

3) 还有其他选择吗?

附言:我对使用[ComplexType]不感兴趣

通过大量假设,您可以尝试BCP出字段的必要子集,并将其中的BCP返回到所需的DB表。这是一个简单且可重复的过程,因为BCP-out SQL语句在您的控制范围内,所以您始终只能导出部分数据(例如,仅导出在某个日期之后创建的记录)。但同样,由于数据量太大,它可能对您不起作用。

我确定的解决方案是"表拆分"选项。

这涉及到在我的模型中添加许多毫无意义的导航属性,并依赖于流畅的API。我认为这是两害相权取其轻,因为它们造成的开销最小,并避免了潜在的性能问题。

我在这个线程中更详细地概述了解决方案(包括代码):

EF6无法为表拆分/共享主键+基类建立模型?

相关内容

  • 没有找到相关文章

最新更新