【发布时间】: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