【问题标题】:EF Table-per-hierarchy mappingEF Table-per-hierarchy 映射
【发布时间】:2011-02-08 16:51:43
【问题描述】:

在尝试规范化数据库架构并将其映射到实体框架中时,我发现最终可能会出现一堆查找表。它们最终将只包含键和值对。我想将它们合并到一个基本上有两列“键”和“值”的表中。例如,我希望能够让 Addresses.AddressType 和 Person.Gender 都指向同一个表,但要确保导航属性只返回适用于相应实体的行。

编辑:哎呀。我才意识到我漏掉了这一段:

这似乎是 TPH 类型的问题,但我所做的所有阅读都表明您从父实体中的字段开始并将字段迁移到继承的子实体。我没有任何字段可以移到这里,因为通常只有两个。

有很多特定领域的键值对需要表示。其中一些会不时更改,其他则不会。而不是挑选和选择,我只想让所有东西都可以编辑。由于要使用的这些类型的属性的数量,我宁愿不必维护需要重新编译的列表枚举,或者最终得到很多查找表。所以,我认为这可能是一个解决方案。

有没有办法在 EF4 中表示这种结构?或者,我是在找错树了吗?

编辑:我想另一种选择是在数据库级别构建我想要的表结构,然后在其上编写视图并将它们显示为 EF 实体。这只是意味着任何维护都需要在多个级别上进行。这听起来比纯 EF 解决方案更受欢迎还是更不受欢迎?

【问题讨论】:

  • 首先,尝试从对象方面来设想它。你在这里谈论关系。在您的模型中,AddressType 和 Gender 之间的家庭关系有多大意义?
  • 我真的不想在这两个属性之间创建任何类型的概念关系。我正在查看的所有属性在下面都有相同的基本架构:“键”和“值”。我只想能够将多个属性映射到同一个基础表结构。从事物的对象方面来看,不会有任何关系。

标签: entity-framework entity-framework-4


【解决方案1】:

每个层次结构的表要求您有一个父实体,用作子实体的基类。所有实体都映射到同一个表,并且有特殊的鉴别器列来区分存储在数据库记录中的实体类型。即使您的子实体没有定义任何新属性,您通常也可以使用它。您还必须为您的表定义主键,否则它将在 EF 中作为只读实体处理。所以你的表格可能看起来像:

CREATE TABLE KeyValuePairs
(
  Id INT NOT NULL IDENTITY(1,1),
  Key VARCHAR(50) NOT NULL,
  Value NVARCHAR(255) NOT NULL,
  Discriminator VARCHAR(10) NOT NULL,
  Timestamp Timestamp NOT NULL 
)

您将使用属性 Id、Key、Value 和 Timestamp(设置为固定的并发模式)定义顶级 KeyValuePair 实体。鉴别器列将用于继承映射。

请注意,EF 映射是静态的。如果您定义了 AddressType 和 Gender 实体,您将能够使用它们,但您将无法动态定义像 PhoneType 这样的新类型。这将始终需要修改您的 EF 模型、重新编译和重新部署您的应用程序。

从 OOP 的角度来看,最好不要将其建模为对象层次结构,而是使用多个不相关实体到同一个表的条件映射。不幸的是,即使 EF 支持条件映射,我还从来没有能够将两个实体映射到同一个表。

【讨论】:

  • 当我尝试在子实体中添加条件时,似乎无法显示除 ID 以外的任何列。
  • @kettch:条件是什么意思?
  • 也许这就是您所说的您无法开始工作的原因。添加继承表后,我去添加条件映射,下拉列表中除了父级的 PK 之外没有其他任何内容。
  • @kettch:查看本教程:robbagby.com/entity-framework/…
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多