问题标签 [tph]

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 回答
182 浏览

entity-framework - 对于未实现所需列的类型,如何避免在所需 TPH 列上进行空插入

我有一组利用 TPH 继承的类。

所以所有类型都在“文档”表中。

某些文档类型具有唯一字段。如果子文档类型具有不可为空的字段,则其他类型在创建实体时会出错,因为 EF 尝试将 NULL 插入数据库中的该列 - 因为子类型不知道该列。

我曾尝试在迁移中使用 defaultValue 将其默认为零,但得到相同的结果。

是否可以在继承类型中有一个不可为空的字段,而基类型根本没有该字段?

或者这总是会导致“无法在 x 列中插入 Null 值”错误?

在这种情况下,该列是一个枚举。

我是否应该将其设为可空并以其他方式强制要求它?

0 投票
1 回答
296 浏览

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

我有一个表大师

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

里面的数据就像

在我的模型课上,我有课

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

在映射我有

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

我正进入(状态

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

0 投票
0 回答
259 浏览

c# - EF:多继承类的 TPH

我有一个具有多个继承类的抽象类,确切地说是 6 个。其中一个类引用了另一个类。 在此处输入图像描述 这是此设置的示例。当我实现这个场景时,我在数据库中创建了一个 TPH 表。但是当我尝试从这个 TPH 表中获取数据时,查询成本非常高,以至于我的应用程序失去了与数据库的连接。

LINQ 查询是这样的:

Entity Framework 创建的 SQL 查询是一个巨大的混乱CASE WHEN,每个继承的类都包含很多。过滤器 (WHERE) 子句占此查询总成本的 82%。


来自 SQL Profiler 的 SQL 转储


我的问题是如何解决这个问题?我试图建立一个 TPC 层次结构,但据我了解,这不适用于这种情况。

  • 我应该重新定义我的 LINQ 查询吗?
  • TPC 是否适用于我的场景?
  • 我应该如何处理这种情况?
0 投票
1 回答
467 浏览

c# - 将字段定义为受保护的属性

我为一张桌子设计了一个抽象类

并从它扩展了一些类(TPH)我发现当属性定义为受保护时,它们不会在数据库中生成,它们应该是公共的(以上是受保护的其他 sts)。但我想从另一个命名空间隐藏上述属性并为它们使用不同的名称,例如:

0 投票
0 回答
321 浏览

c# - 无法在 EF TPH 中查询继承的类型属性

使用ef版本 6.1.3 和 Unity 存储库在 asp.net mvc5上工作。假设有一个模型,其基本类型为SmartDevice三种派生类型SmartRainbowSmartRouterSmartSwitch。像下面这样:

构造函数具有以下语法

智能设备

智能开关

智能彩虹

通过查询SmartDevice我得到所有实体,我的语法如下:

问题是通过上述结果的每个实体都将是SmartRainbowSmartRouterSmartSwitch类型,我无法加载任何单个继承的类型属性和导航属性。

使用下面的语法我无法加载导航属性

  • 无法加载SmartSwitch属性Channels
  • 不能在OfType方法后使用include吗?
  • 为什么不能在OfType之后包含
0 投票
0 回答
541 浏览

c# - Entity Framework 6,不同的子属性共享同一个基外键

我有一个类层次结构,即数据库中的 TPH。所以我们有一个类Base,子类继承自它。假设它们是ChildrenA, ChildrenB, ChildrenC

Base层次结构与另一个类层次结构(也在数据库中的 TPH 中表示)具有概念上的关系,其中基类是RelatedBase,具有子类RelatedChildrenARelatedChildrenBRelatedChildrenC

概念关系是:

  • ChildrenA只能与RelatedChildrenA
  • ChildrenB只能与RelatedChildrenB
  • ChildrenC只能与RelatedChildrenC

我正在使用具有独立关联 MapKey方法的实体框架流畅映射,以避免将外键 id 作为属性公开。

因此,基本上,从 TPH 层次结构到另一个 TPH 层次结构只有一个外键。

鉴于此外键在数据库中称为 RelatedId,我试图表达我的流畅映射如下:

不幸的是,这会产生以下错误:

在模型生成期间检测到一个或多个验证错误:RelatedId:名称:类型中的每个属性名称必须是唯一的。已定义属性名称“RelatedId”。RelatedId:名称:类型中的每个属性名称必须是唯一的。已定义属性名称“RelatedId”。

这是否有可能将相同的子属性映射到相同的基本外键?

0 投票
1 回答
943 浏览

rest - c#, web api, swashbuckler/swagger

这是我的第一个 web api,第一个 web 应用程序,也是我第一次通过 swashbuckler 使用 swagger。我将 TPH 用于我的设备数据库表。
例如,我有一个名为设备的基类,其中有几个从设备继承的子类。(这不是真正的代码,所以我没有把所有的公众等)
正如我所期望的那样,当我在浏览器中运行 swagger 时,模型描述只是返回设备类的模型,
我用谷歌搜索了如何显示所有可能的模型但是无法理解这些回复,因为它们与 c# 或使用文档注释的 api 控制器无关,或者它们是为比我更了解这一点的人编写的。
任何人都可以发布一个例子,或者请给我一个初学者教程,关于如何让所有可能的模型大摇大摆。我不得不编写几个不同的 api 调用来解决这个问题,只是为了显示模型。
谢谢

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 投票
3 回答
1105 浏览

c# - 在 TPH 上使用 EF 包含

我已经使用 THP 实现了具有简单继承的代码优先数据库架构: 数据库图

我需要查询所有类型的所有通知。 TargetUser表中的属性NotificationUser是一个关联。我正在尝试执行下一个代码:

在数据库TargetUser中属性设置为正确的外键,但在代码中我没有得到任何结果。延迟加载已启用。

是否可以用户急切加载?我已经尝试过写_context.Notifications.Include('TargetUser')它会引发异常。


更新。例外是:


试图将此答案修改为:

但仍然抛出相同的异常。

0 投票
1 回答
123 浏览

c# - 实体框架代码前两个导航属性到/从一个抽象实体

以下实体首先是我的代码,其中 PersonParameter 是一个抽象类, Shirt 和 Shoes 是从它继承而来的 typ(1,2)

对于模型 dbcontext

但是上面的代码会在 Person 表中创建不需要的字段 PersonParameter_id:

我该如何解决它(PersonParameter_id) 我用 HasOptional.WithMany 做了一些 FluentApi 但没有解决。

编辑
经过一些测试,发现对于非抽象类,它也会创建额外的 id,解决该问题的一种解决方案是从参数类中删除导航属性并将其添加到继承类(衬衫和鞋子)