5

我们正在遗留数据库上制作 EntityFramework CodeFirst DAL (这意味着我们大多会遇到它所存在的任何设计错误)。

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

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

数据库模型紧随其后的是表 Cards、Homes、Cars、Owners 和 Renters,其中 Cards 包含公共列,而其他表包含与特定类有关的列。这正是 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 {}

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

PS我们的基表 Cards 确实有一个鉴别器字段,如果这可能有帮助的话。

4

1 回答 1

0

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

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

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

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

于 2012-07-24T10:25:37.373 回答