实体框架(Code First)继承映射:TPT和TPC的混合

时间:2012-07-24 10:21:55

标签: .net entity-framework table-per-type table-per-class

我们正在传统数据库上创建一个EntityFramework CodeFirst DAL(这意味着我们大多数时候都遇到了设计错误)。

域模型(非常)简单:我们有抽象卡,子类型为HomeCard,CarCard,OwnerCard和RenterCard。确切地说:

abstract class Card {}
class HomeCard: Card {}
class CarCard: Card {}
class OwnerCard: Card {}
class RenterCard: Card {}

数据库模型遵循表格卡片,家庭,汽车,所有者和租用者,其中卡片包含公共列,其他表格包含与特定类别相关的列。这正是TPT的意思,它完美映射到EntityFramework。

重构后,我们发现(不出意外)Home和Car确实分享了一些属性,而Owner和Renter也是这样做的。它不仅仅是为了美丽,而且一些功能更容易实现(例如,按名称搜索所有者 Renters,或者按所有者搜索Homes 卡) 。所以我们希望我们的域模型看起来像这样:

abstract class Card {}
abstract class ProperyCard: Card {}
class HomeCard: ProperyCard {}
class CarCard: ProperyCard {}
abstract class PersonCard: Card {}
class OwnerCard: PersonCard {}
class RenterCard: PersonCard {}

但我们仍然拥有相同的数据库模型,这意味着我们在TPT和TPC之间有一些奇怪的混合。我们通过EF / CodeFirst映射它的所有尝试都失败了。有关使其有效的任何建议吗?

PS 我们的基表Cards,确实有一个鉴别器字段,如果可以提供任何帮助。

1 个答案:

答案 0 :(得分:0)

您有一个现有的数据库,因此您不想先使用代码。将实体数据模型项添加到项目中,并使用提供的向导将其连接到现有数据库。

我不建议使用以下但如果您必须使您的CF模型与现有数据库一起使用,请尝试以下步骤。

  1. 让CF生成新数据库。
  2. 将EDMMetaData(< EF4.3.1)或__MigrationHistory(> = EF.4.3.1)表复制到现有数据库。这将欺骗 EF认为它创建了数据库并且匹配。
  3. 注意:在针对旧数据库使用CF框架时,您很可能会遇到错误。如果您的CF框架不是完美,它将受到影响。