gpt4 book ai didi

entity-framework - EF Table-per-hierarchy 映射

转载 作者:行者123 更新时间:2023-12-04 08:29:09 25 4
gpt4 key购买 nike

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

编辑:糟糕。我刚刚意识到我遗漏了这一段:

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

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

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

编辑:我想另一种选择是在数据库级别构建我想要的表结构,然后在其之上编写 View 并将它们显示为 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、Key、Value 和 Timestamp(设置为固定并发模式)定义顶级 KeyValuePair 实体。鉴别器列将用于继承映射。

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

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

关于entity-framework - EF Table-per-hierarchy 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com