EF表每层次结构映射

时间:2011-02-07 22:23:06

标签: entity-framework entity-framework-4

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

编辑:哎呀。我刚刚意识到我把这一段落了出来:

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

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

有没有办法在EF4中表示这种结构?或者,我是在咆哮错误的树吗?

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

1 个答案:

答案 0 :(得分:2)

每个hiearchy表要求您有一个父实体,用作子实体的基类。所有实体都映射到同一个表,并且存在特殊的鉴别器列,以便存储在数据库记录中的实体类型不同。即使您的子实体未定义任何新属性,您通常也可以使用它。您还必须为您的表定义主键,否则它将作为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实体。 Discriminator列将用于继承映射。

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

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