问题标签 [table-per-hierarchy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
410 浏览

c# - Entity Framework 6.1.1 忽略 ProxyCreationEnabled 设置

我有一个上下文类,在某些时候我需要从我的 POCO 类中的数据库中获取数据,以便我可以序列化该数据并发送到我的 Web 服务。我不想反序列化另一端的代理,但我无法强制 EF 创建我的 POCO 类。

我正在使用以下代码来检索数据:

请注意,TreeNodes 是 TPH,而基类是抽象的。在我的情况下,有没有办法获得 POCO 课程?

0 投票
0 回答
58 浏览

c# - 每个层次结构的表不是 EF6 的默认行为

我正在尝试将这三个类映射到一个 EF 表。在这种情况下,我的基类实际上有一个基 Entity 类,这会导致我的问题吗?我没有找到任何涵盖默认行为未正确处理的场景的示例。

基类

子班:

实体基类:

生成的表结构

0 投票
1 回答
61 浏览

nhibernate - nHibernate - 有没有办法调试 TPH 对象的创建?

我有一个由代码映射的按层次结构的表结构,以及一个包含数据的表 - 116 行。最初,该表(和整个数据库)是使用 Entity Framework Code First 方法创建的。由于某些原因,我从 EF 切换到 NH,并尝试从提到的表中获取数据导致 115 个正确创建的对象,并且只有一行导致代理对象的基类型错误。我试图找出其他相似行和错误行之间的差异(有 30 行具有相同的鉴别器值),但我失败了。因此,问题是 - 我可以使用什么调试技术来解决我的问题?

下面是我如何从表中加载数据的小片段:

这是一个映射:

0 投票
2 回答
1545 浏览

c# - Table-per-hierarchy 和复合主键

我在旧数据库中有两个表(我无法修改),数据如下:

两个旧表

Table1 有一个复合主键(Code、Abbrev),但 Abbrev 也用作鉴别器(见下文)。Table2 有两个外键列(CodeA、CodeB),它们都引用 Table1 中的相同字段 Code。Table1.Code 字段中有重复项。

我想在 Entity framework 6 中使用 table-per-hierarchy 方法。因此,我创建了以下模型类:

我在 DataContext : DbContext 类中定义了 table-per-hierarchy ,如下所示:

问题是当我想使用这种映射时 - 我不能使用鉴别器字段(Table1.Abbrev)作为 MyBaseClass 中复合键的一部分 - 我收到以下错误:

EntitySet 'DataContext.MyBaseClass' 中的所有对象都必须具有唯一的主键。但是,“MyBaseClassA”类型的实例和“MyBaseClassB”类型的实例都具有相同的主键值,“EntitySet=MyBaseClass;Code=1”。

是否可以将上面的模型与实体框架 6(或更高版本)映射?

0 投票
0 回答
471 浏览

entity-framework - EntityFramework Table Per Hierarchy 查询多个鉴别器

这是场景 -

我们有一个支持发布到多个社交网站(Facebook、Twitter、G+ 等)的应用程序。

我们使用 TPH 将其构建在一个Posts表中,并带有一个鉴别器列。这些“社交”帖子中的每一个都派生自一个公共基类,适当地称为SocialPost.

我们只是说它会用,和context.SocialPosts的鉴别器抓取所有内容。FacebookPostTwitterPostGooglePost

现在我们需要能够获取类型的混合搭配。基于一个设置,我们希望撤回所有,例如 Facebook 和 Google Posts 以进行处理,同时保持 Twitter 不变。

有没有一种理智的方法可以在一个查询中做到这一点?

以下代码

将产生如下 SQL

这显然不是我想要的。我不确定在鉴别器上使用双重过滤器本身是否重要,但使用它绝对是奇怪的 SQL。

那么,有没有一种理智的方法可以通过一个查询来获取多个鉴别器类型,或者最好是全部获取SocialPosts然后在应用程序端过滤掉我不想要的那些。

0 投票
4 回答
4504 浏览

c# - 在 dapper 中查询抽象模型

我正在使用 Table Per Hierarchy 数据库继承,其中所有派生类型的列都在一个表中。每个派生表都使用包含派生类名称的字符串鉴别器字段进行标识:

正如预期的那样,当通过 Dapper 的查询方法检索它时,我收到Instances of abstract classes cannot be created. 我希望这将返回一个 Animal 列表,它们的值是各自的派生类型。

我尝试添加对此的支持没有成功。如果传入的类型是抽象类,则在调用 SqlMapper.cs::GetTypeDeserializer() 之前,我将类型替换为以下方法中返回的类型:

但是,此时阅读器似乎尚未打开,因此失败并显示Invalid attempt to read when no data is present.

这是正确的方法吗?是否有任何努力在其他地方支持这一点?

0 投票
1 回答
1915 浏览

c# - Entity Framework Code First TPH 鉴别器列

我正在使用具有 Code First 和 Table per Hierarchy (TPH) 继承的 Entity Framework 6.0。

请参阅以下 MWE(我省略了其他 fluent api 语句以澄清问题所在):

我想将所有具有1for 列Type(应该是鉴别器列)的条目映射到 class CEO1与列的条目不同的所有条目Type都应映射到类Other

这里出现了两个问题。第一个是如何编写.HasValue(**<>1**));正确的代码。第二件事是我想Type在我的代码中使用该列,但由于这是鉴别器列,我无权访问它。

0 投票
3 回答
1154 浏览

c# - 实体框架多级继承与 TPH

我正在使用一个为一定数量的项目实现 TPH 的遗留系统。所以当前的结构看起来像这样

因此,类型 (T*) 是所有表的鉴别器,但由于某些类型共享公共列,因此存在大量不同的表。问题是所有这些项目实际上都有一个小的共同点,但是没有办法将所有这些项目收集到一个集合中。实际上,层次结构实际上应该看起来更像这样。

所以本质上我们拥有的是一个 TPT,其中每个类型的每个表都是一个 TPH。对于一个真实世界的例子,这就是我们需要的。

显然,最初的设计存在一些设计缺陷,没有人预计需要在不查询 3 个不同的表的情况下获取所有车辆的列表。所以我的问题是,现有的结构有没有办法将这个新的层次结构添加到实体框架中。我在想这样的事情

这可能吗?有没有办法在实体框架中映射这些?我似乎无法正确匹配它们。如果我们用 VehicleId 替换 BoatId、PlaneId 和 CarId (如实体框架中的条件映射 - 或使用 TPH 的操作) ,似乎它可能会起作用,但那时我们将进行真正侵入性的模式更改,这并不是真正的选项,我不确定这是否可行。本质上,我需要一种将现有键映射到新层次结构的方法。任何帮助是极大的赞赏。我很茫然,似乎找不到任何可以回答我问题的解决方案。

0 投票
1 回答
594 浏览

entity-framework - Entity Framework Table Per Hierarchy Inserting Multiple Id Columns

I have seriously spent two work days trying to a TPH setup from Database First to Code first. The Error I get is Something like "Invalid Column Name Entity_EntityId/ Entity_Entity_Id1"

I've drawn up a very basic reproduction of the issue like so:

Context:

Mapping:

Entities:

How can I get the table to just have a single "AnotherClassId?"

0 投票
1 回答
2944 浏览

c# - 每个层次结构的实体框架表不创建鉴别器

经过几次迁移,我创建了一个继承层次结构。现在,当我使用代码优先迁移更新数据库时,代码优先不会自动创建鉴别器字段。此后,我删除了该表并重新创建了它(使用代码优先迁移),但没有任何运气。我唯一能想到的是派生类中没有额外的“非虚拟”属性——创建继承结构是为了强制执行一个业务规则,即只有某个派生类型才能与另一个实体有关系。

基础类型:

派生类(没有不同/唯一的标量属性):

另一种派生类型

代码优先是否没有在数据库中添加鉴别器列,因为它看不到派生类之间的任何差异(因为没有任何唯一的“非虚拟”属性)?如果是这样,我该如何解决这个问题?如果不是,代码优先不会在数据库中自动创建鉴别器列的一些​​原因是什么?我有另一个 TPH 结构,它完全按照它应该的方式工作。

数据库上下文:

我还尝试创建每个派生类型独有的“虚拟”属性。代码迁移将新属性作为列添加到表中,但迁移没有创建鉴别器列。