问题标签 [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.
entity-framework - 将实体框架代码中的 Table-Per-Hierarchy 和 Table-Per-Type 混合到现有数据库中
tl; dr:我正在尝试将代码优先模型映射到现有数据库,其中某个对象层次结构具有混合继承方案。一些具体的类使用 TPH,一些使用 TPT。我似乎无法正确映射。
我有一个对象层次结构,我试图将其映射到现有数据库。一些具体的类包含额外的属性,所以它们有自己的表;一些具体的类没有,因此它们存在于基表中并依赖于鉴别器列。为了简化事情,我创建了一个 POC。数据库结构是这样的:
等效的 POCO 将是:
看起来很简单。所以我的第一次尝试是下面的映射(流利的或者带属性的,结果都是一样的):
但这不起作用,因为:
- 它想在表中创建
FooTpt.FooType
鉴别器FooTpts
尝试执行命令会给我以下错误(可能是因为上面的第 1 点):
(6,10):错误 3032:从第 6、11 行开始映射片段时出现问题:EntityTypes ConsoleApplication1.FooTph、ConsoleApplication1.FooTpt 被映射到表 Foo 中的相同行。映射条件可用于区分这些类型映射到的行。
回到绘图板。这个答案建议创建一个映射到父 (TPH) 表的中间抽象实体。一切都可以通过另一层抽象来解决,对吧?所以我做了一些改变:
并更改映射:
数据库现在看起来不错,并且我们在父表中有一个鉴别器。但是仍然缺少一些东西,我们得到了同样的错误:
(6,10):错误 3032:从第 6、11 行开始映射片段时出现问题:EntityTypes ConsoleApplication1.FooTph、ConsoleApplication1.FooTpt 被映射到表 Foo 中的相同行。映射条件可用于区分这些类型映射到的行。
这实际上没有意义,因为所有FooTpt
s 都必须是 aFooTptBase
根据定义,这应该需要FooType == 2
. (就好像模型构建器忽略了我的中间FooTptBase
抽象类型?)
那么,我错过了什么?我怎样才能完成我想做的事情?
c# - 递归地将多个 Datatable 层次结构序列化为 JSON 对象
我想将多个相互关联的数据表序列化为 JSON,并且可能会在映射表中设置其他表。在这种情况下,我有 3 个数据表。
- 表 A 作为父级
- 表 B 作为表 A 的子表
- 表 C 作为表 B 的子表
JSON输出应该是
我已经尝试过这样的代码,但它似乎不起作用
entity-framework - 防止循环 parent_ID `table per type` vs `table per hierarchy` vs `table per class`
我在实体框架中使用 Table Per Hierarchy TPH,它基本上是扩展数据类型的公共核心属性的部分类。
我有 2 个对象/类;Course
Object 和一个与 .Student
共享相同基本属性的 Object MyBaseCommonEntity
。目标是能够Service/ticket
对任一对象执行 a。我在建模时需要帮助,这是泛型类型还是继承类型?
我的问题:我使用 int 来引用 parentID。表的 pK Key 也是一个 int。
- 如何防止循环引用
- 设置时是否已完成此检查
- Hierarchy id 类型是否默认为我提供此功能?
每个类型的表与每个层次结构的表与每个类的表之间有什么区别`
/li>
c# - 有什么方法可以指示实体框架以代码优先、每层次结构表的方法从列映射到模型属性?
我们Entity Framework 6.1
在我们的 MVC 应用程序中使用,使用code-first
和table-per-hierarchy
方法,因为我们是从头开始开发的,我们认为这种方式适合快速开发。但是现在我有一个问题:假设我有一个基类和三个子类,它们看起来像这样:
使用默认设置时,EF 将为数据库表创建 6 列:ID、Name、Volume、Volume1、Number 和 Discriminator。Volume 列将仅用于 SubClassOne,Volume1 将用于 SubClassTwo,Number 仅用于 SubClassThree。
我不太关心数据库行空间的“浪费”。但是有一件事情困扰着我:如果我是一个新开发人员并且现在正在直接查看数据库,“Volume”和“Volume1”的名称会让我感到困惑。我知道在代码方面有 SubClassOne 和 SubClassTwo,它们都有一个名为“Volume”的属性。但我永远不知道哪个专栏是哪个班级的。所以我的问题是,有什么方法可以指示实体框架(例如,使用属性)两者SubClassOne.Volume
都SubClassTwo.Volume
映射到Volume
数据库中的列。(另一个好处是我减少了一列,但这不是我的主要目标)。
我想如果我不使用实体框架、代码优先或每层次结构表,并自己设计表,尤其是 DAL,我可以完全控制并实现这一点。但是现在呢?
c# - 实体框架:- 转换以派生类时在表中按层次结构查询抛出异常时出错
当我尝试转换为派生类时遇到异常;无法将类型 '' 转换为类型 ''。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。
c# - 使用 TPH 在基类中插入数据时鉴别器为 NUll
我有一个表大师
- ID
- 标签
- 文本
- 鉴别器
里面的数据就像
在我的模型课上,我有课
我有 Field20、Field21 和 Field22 的课程,如下所示
在映射我有
现在,当我试图为大师增加价值时
我正进入(状态
无法将值 NULL 插入到列“鉴别器”、表“主”中;列不允许空值。插入失败。该语句已终止。
c# - 通过数据注释创建实体框架 TPH 鉴别器列
我想通过数据注释创建鉴别器列。
流利的映射
无论如何,我需要在选择结果中有鉴别器列值
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 做出什么样的假设。
c# - 每个层次结构和一对一关系的实体框架表
我在结合 EF 6 代码优先和 SQL-Server 中的一对一关系来实现按层次结构表的体系结构时遇到了麻烦。实体框架不使用右列作为外键。
我有一个类Version
和两个继承类ProductVersion
和FeatureVersion
.
这两个继承类只实现导航属性。
现在在我的产品中,我使用了一对多的关系,一切正常。
在我的功能中,我使用了一对一的关系并且事情出错了。
生成的迁移如下所示
如您所见,Features 的外键使用了错误的列。
当我t => t.ID
手动更改t => t.FeatureId, cascadeDelete: true
为外键正确插入数据库时,但 EF 似乎在插入带有初始的新功能时出现问题FeatureVersion
;newFeatureVersion
的FeatureId
列始终设置为 0,因此会导致异常(在代码中,我只是将一个新FeatureVersion
对象分配给 Feature 对象并尝试保存上下文更改)。具有一对多关系的 Product 一切正常。
有趣的是,当我将 Feature 中的引用从
至
例如母班,一切正常;在迁移中,我看到加入了正确的列,并且 INSERT 也可以正常工作。但可以肯定的是,这不是我想要的。
继承是否会以某种方式刺激 EF?我错过了重要的一点吗?
我还尝试将关系更改为与 forFeatureVersion
相同的一对多关系Product
。它工作正常,但这不是我需要使用的关系。