【问题标题】:EntityFramework (CodeFirst) inheritance mapping: mix of TPT and TPC实体框架(代码优先)继承映射:TPE 和 TPC 的混合
【发布时间】:2012-07-24 10:21:54
【问题描述】:

我们正在一个 legacy 数据库上创建 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 也这样做。而且它不仅是为了美观,而且一些功能会更容易实现(例如,按名称搜索 Owners Renters,或按所有者搜索 Homes Cards) .所以我们希望我们的领域模型看起来像这样:

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 确实有一个鉴别器字段,如果这可能有帮助的话。

【问题讨论】:

  • 为什么您首先尝试在现有数据库上编写代码?
  • 因为我喜欢映射的描述方式。本质上它不是“代码优先”,而是“代码即模型”。
  • 我以某种方式预计您将无法将其映射到 EF,因为您的中间类不是真正的实体。
  • @LadislavMrnka 坦率地说,这也是我所期望的。但我希望如果有答案,社区会知道。
  • 嘿,Serg,我认为鉴别器字段是你最好的选择。比如说,将它映射到一个可以进行按位比较的枚举。即 CardType.Property | CardType.Home 等...对你有用吗?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 使用 CodeFirst,因为映射模型完全不同。在我看来,名称总是错误的,应该是 CodeOnly,而不是 CodeFirst
  • @SergRogovtsev 查看编辑。我添加了关于如何欺骗您的 CF 框架使用您的旧数据库的建议。
  • 你还没有理解我的问题。让 EF/CF 认为它与数据库匹配没有问题。我的问题是我们没有找到支持我们特定继承方案的有效映射配置。
  • 我正在使用现有的数据库,Code First 对我来说非常有效。由于错误和 EDM 配置的复杂性,我在使用 EF 设计器时遇到了各种问题。您所要做的实际上就是删除初始迁移中的所有内容,并确保初始数据模型完美地映射到数据库中。一旦你这样做了,你的模型实际上就是一个 Code First 模型。
猜你喜欢
  • 1970-01-01
  • 2011-08-08
  • 2014-03-15
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多