.net - Entity Framework (代码优先)继承映射 : mix of TPT and TPC

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

我们正在通过 创建 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 包含公共(public)列,而其他表包含与特定类有关的列。这正是 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 确实有一个鉴别器字段,如果这可能有帮助的话。

最佳答案

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

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

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

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

    关于.net - Entity Framework (代码优先)继承映射 : mix of TPT and TPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11628796/

    相关文章:

    .net - 具有完整 .NET Framework 和 Angular 2 的 ASP.NET Core

    c# - 在 mvc 站点之间共享代码的 GAC 替代方案

    performance - DDD 和 Entity Framework 、过滤器

    c# - ObservableCollection.Contains() 无法正常工作

    c# - 如何将 2d30m 这样的字符串格式更改为时间跨度?

    sql-server - Entity Framework 代码优先与 SQL Server 同义词

    c# - 使用 new 进行 linq 查询的更好方法

    entity-framework - Entity Framework 5按类型更新表,更改子类型,但保持相同的基本类型

    entity-framework - 每个类型的 Entity Framework 表 - 仅从基本类型列中选择