Entity framework 每个层次映射的EF表

Entity framework 每个层次映射的EF表,entity-framework,entity-framework-4,Entity Framework,Entity Framework 4,在尝试规范化数据库模式并将其映射到实体框架中时,我发现可能最终会出现一堆查找表。它们最终只包含键和值对。我想将它们合并到一个表中,该表基本上有两列“Key”和“Value”。例如,我希望能够将Addresses.AddressType和Person.Gender都指向同一个表,但确保导航属性仅返回适用于相应实体的行 编辑:哎呀。我刚刚意识到我遗漏了这一段: 这似乎是TPH类型的问题,但我所做的所有阅读都表明您从父实体中的字段开始,并将字段迁移到继承的子实体。我没有任何字段可以移动到这里,因为通常

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

编辑:哎呀。我刚刚意识到我遗漏了这一段:

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

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

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


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

每个层次的表要求您有一个父实体,用作子实体的基类。所有实体都映射到同一个表,并且有一个特殊的鉴别器列来区分存储在数据库记录中的实体类型。即使您的子实体未定义任何新特性,也可以使用它。您还必须为表定义主键,否则它将在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、键、值和时间戳(设置为并发模式固定)定义顶级KeyValuePair实体。鉴别器列将用于继承映射

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


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

首先,试着从对象方面设想它。你在这里说话。在你的模型中,地址类型和性别之间的家庭关系有多大意义?我真的不想在这两个属性之间建立任何概念关系。我看到的所有属性下面都有相同的基本模式:“key”和“value”。我只希望能够将多个属性映射到同一个底层表结构。从对象的角度看,没有任何关系。当我试图在子实体中添加条件时,除了ID之外,我似乎无法显示任何列。@Ketch:条件是什么意思?也许这就是你说的无法工作的原因。添加继承的表后,我将添加条件映射,下拉列表中除了父表的PK之外没有其他内容。@kettch:检查本教程: