EntityFramework(CodeFirst)继承映射:TPT和TPC的混合

Ser*_*sev 5 .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 {}
Run Code Online (Sandbox Code Playgroud)

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

在重构之后,我们发现(并非出乎意料)Home和Car确实共享了一些属性,而Owner和Renter也是这样做的.并且它不仅仅是为了美观,而且一些功能将更容易实现(例如按名称搜索所有者租用者,或者由所有者搜索家庭卡片).所以我们希望我们的域模型看起来像这样:

abstract class Card {}
abstract class ProperyCard: Card {}
class HomeCard: ProperyCard {}
class CarCard: ProperyCard {}
abstract class PersonCard: Card {}
class OwnerCard: PersonCard {}
class RenterCard: PersonCard {}
Run Code Online (Sandbox Code Playgroud)

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

PS我们的基本表卡,确实有一个鉴别器字段,如果这可能有任何帮助.

Pau*_*ing 0

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

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

  1. 让CF生成一个新的数据库。
  2. 将 EDMMetaData (<EF4.3.1) 或 __MigrationHistory (>=EF.4.3.1) 表复制到现有数据库。这将欺骗EF 认为它创建了数据库并且它匹配。

注意:在针对旧数据库使用 CF 框架时,您很可能会遇到错误。如果你的CF框架不完美,它就会受到影响。