问题标签 [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 投票
0 回答
455 浏览

entity-framework - 将实体框架代码中的 Table-Per-Hierarchy 和 Table-Per-Type 混合到现有数据库中

tl; dr:我正在尝试将代码优先模型映射到现有数据库,其中某个对象层次结构具有混合继承方案。一些具体的类使用 TPH,一些使用 TPT。我似乎无法正确映射。


我有一个对象层次结构,我试图将其映射到现有数据库。一些具体的类包含额外的属性,所以它们有自己的表;一些具体的类没有,因此它们存在于基表中并依赖于鉴别器列。为了简化事情,我创建了一个 POC。数据库结构是这样的:

等效的 POCO 将是:

看起来很简单。所以我的第一次尝试是下面的映射(流利的或者带属性的,结果都是一样的):

但这不起作用,因为:

  1. 它想在表中创建FooTpt.FooType鉴别器FooTpts
  2. 尝试执行命令会给我以下错误(可能是因为上面的第 1 点):

    (6,10):错误 3032:从第 6、11 行开始映射片段时出现问题:EntityTypes ConsoleApplication1.FooTph、ConsoleApplication1.FooTpt 被映射到表 Foo 中的相同行。映射条件可用于区分这些类型映射到的行。


回到绘图板。这个答案建议创建一个映射到父 (TPH) 表的中间抽象实体。一切都可以通过另一层抽象来解决,对吧?所以我做了一些改变:

并更改映射:

数据库现在看起来不错,并且我们在父表中有一个鉴别器。但是仍然缺少一些东西,我们得到了同样的错误:

(6,10):错误 3032:从第 6、11 行开始映射片段时出现问题:EntityTypes ConsoleApplication1.FooTph、ConsoleApplication1.FooTpt 被映射到表 Foo 中的相同行。映射条件可用于区分这些类型映射到的行。

这实际上没有意义,因为所有FooTpts 都必须是 aFooTptBase根据定义,这应该需要FooType == 2. (就好像模型构建器忽略了我的中间FooTptBase抽象类型?)

那么,我错过了什么?我怎样才能完成我想做的事情?

0 投票
1 回答
1084 浏览

c# - 递归地将多个 Datatable 层次结构序列化为 JSON 对象

我想将多个相互关联的数据表序列化为 JSON,并且可能会在映射表中设置其他表。在这种情况下,我有 3 个数据表。

  • 表 A 作为父级
  • 表 B 作为表 A 的子表
  • 表 C 作为表 B 的子表

JSON输出应该是

我已经尝试过这样的代码,但它似乎不起作用

0 投票
1 回答
365 浏览

entity-framework - 防止循环 parent_ID `table per type` vs `table per hierarchy` vs `table per class`

我在实体框架中使用 Table Per Hierarchy TPH,它基本上是扩展数据类型的公共核心属性的部分类。

我有 2 个对象/类;CourseObject 和一个与 .Student共享相同基本属性的 Object MyBaseCommonEntity。目标是能够Service/ticket对任一对象执行 a。我在建模时需要帮助,这是泛型类型还是继承类型?

我的问题:我使用 int 来引用 parentID。表的 pK Key 也是一个 int。

  1. 如何防止循环引用
  2. 设置时是否已完成此检查
  3. Hierarchy id 类型是否默认为我提供此功能?
  4. 每个类型的表与每个层次结构的表与每个类的表之间有什么区别`

    /li>
0 投票
1 回答
738 浏览

c# - 有什么方法可以指示实体框架以代码优先、每层次结构表的方法从列映射到模型属性?

我们Entity Framework 6.1在我们的 MVC 应用程序中使用,使用code-firsttable-per-hierarchy方法,因为我们是从头开始开发的,我们认为这种方式适合快速开发。但是现在我有一个问题:假设我有一个基类和三个子类,它们看起来像这样:

使用默认设置时,EF 将为数据库表创建 6 列:ID、Name、Volume、Volume1、Number 和 Discriminator。Volume 列将仅用于 SubClassOne,Volume1 将用于 SubClassTwo,Number 仅用于 SubClassThree。

我不太关心数据库行空间的“浪费”。但是有一件事情困扰着我:如果我是一个新开发人员并且现在正在直接查看数据库,“Volume”和“Volume1”的名称会让我感到困惑。我知道在代码方面有 SubClassOne 和 SubClassTwo,它们都有一个名为“Volume”的属性。但我永远不知道哪个专栏是哪个班级的。所以我的问题是,有什么方法可以指示实体框架(例如,使用属性)两者SubClassOne.VolumeSubClassTwo.Volume映射到Volume数据库中的列。(另一个好处是我减少了一列,但这不是我的主要目标)。

我想如果我不使用实体框架、代码优先或每层次结构表,并自己设计表,尤其是 DAL,我可以完全控制并实现这一点。但是现在呢?

0 投票
3 回答
143 浏览

c# - 实体框架:- 转换以派生类时在表中按层次结构查询抛出异常时出错

当我尝试转换为派生类时遇到异常;无法将类型 '' 转换为类型 ''。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

0 投票
1 回答
296 浏览

c# - 使用 TPH 在基类中插入数据时鉴别器为 NUll

我有一个表大师

  • ID
  • 标签
  • 文本
  • 鉴别器

里面的数据就像

在我的模型课上,我有课

我有 Field20、Field21 和 Field22 的课程,如下所示

在映射我有

现在,当我试图为大师增加价值时

我正进入(状态

无法将值 NULL 插入到列“鉴别器”、表“主”中;列不允许空值。插入失败。该语句已终止。

0 投票
1 回答
714 浏览

c# - 通过数据注释创建实体框架 TPH 鉴别器列

我想通过数据注释创建鉴别器列。

流利的映射

无论如何,我需要在选择结果中有鉴别器列值

0 投票
0 回答
552 浏览

c# - 如何使用 EF-TPH 类编写选择查询

处理 EF-6 mvc5 项目。面对每个层次结构类的表问题。我的类结构如下。

在此处输入图像描述

上图详细描述了类关系。

想写一个选择查询,它可以选择我的房间以及与设备类型相关的设备,所以我写了下面的查询,但它不起作用。

上面的查询显示错误消息“包含路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用 Select 运算符作为集合导航属性。参数名称:路径”。具有TPH关系的表,如何在其中制作导航属性。

在这种情况下如何编写选择查询。

0 投票
0 回答
427 浏览

c# - 当 EF6 使用 Table-Per-Hierarchy (TPH) 映射策略时,父实体中具有派生类的多个集合不起作用

我花了周末的大部分时间试图弄清楚这一点。

我有一个带有订阅表的现有数据库,我想使用 TPH 继承策略将其映射到我的域中的实体。

Subscription 有几种类型,每种都有自己的特点,因此需要继承。这是域的简化版本:

这些实体在上下文中映射如下:

正如预期的那样,当查询任何派生类的上下文时,EF 使用 ServiceTypeId 作为鉴别器正确构造查询。当我尝试在 Customer 实体中包含派生类时,就会出现问题。这有效:

这不起作用:

这也不是:

当我检查分析器时,我可以看到在这两种情况下,EF 添加了 _id 后缀并尝试查询除 customerID 之外的不存在的 customer_id 列。我试图为派生类型显式映射外键,但 EF 然后抱怨:

外键组件“CustomerID”不是“TVSubscription”类型的声明属性。验证它没有被明确地从模型中排除,并且它是一个有效的原始属性。

CustomerID 在派生类中没有位置,但即使我尝试将它移到那里它也不起作用(我怀疑是因为 EF 正在尝试使用另一种继承策略进行映射)。

现在,我知道我可以这样做:

但是,使用这种方法,EF 会在 db 中查询整个订阅集,然后在本地对其进行过滤以仅返回 TVSubscriptions。这当然不是理想的,因为客户可以有数百个订阅,最好我希望 EF 只查询并返回某种类型的订阅——就像我在使用 dbContext 时所做的那样。

所以问题是,如何在 Customer 类中包含 TVSubscriptions 列表并让 EF 仅查询这些?

如果这是不可能的,当我将派生类的集合添加到客户实体时,有人可以解释 EF 做出什么样的假设。

0 投票
0 回答
467 浏览

c# - 每个层次结构和一对一关系的实体框架表

我在结合 EF 6 代码优先和 SQL-Server 中的一对一关系来实现按层次结构表的体系结构时遇到了麻烦。实体框架不使用右列作为外键。

我有一个类Version和两个继承类ProductVersionFeatureVersion.

这两个继承类只实现导航属性。

现在在我的产品中,我使用了一对多的关系,一切正常。

在我的功能中,我使用了一对一的关系并且事情出错了。

生成的迁移如下所示

如您所见,Features 的外键使用了错误的列。

当我t => t.ID手动更改t => t.FeatureId, cascadeDelete: true为外键正确插入数据库时​​,但 EF 似乎在插入带有初始的新功能时出现问题FeatureVersion;newFeatureVersionFeatureId列始终设置为 0,因此会导致异常(在代码中,我只是将一个新FeatureVersion对象分配给 Feature 对象并尝试保存上下文更改)。具有一对多关系的 Product 一切正常。

有趣的是,当我将 Feature 中的引用从

例如母班,一切正常;在迁移中,我看到加入了正确的列,并且 INSERT 也可以正常工作。但可以肯定的是,这不是我想要的。

继承是否会以某种方式刺激 EF?我错过了重要的一点吗?

我还尝试将关系更改为与 forFeatureVersion相同的一对多关系Product。它工作正常,但这不是我需要使用的关系。