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

nhibernate - NHibernate/Conform 中的一个类中每个类层次结构的两个表集合

我遇到了以下情况:我有每个类层次结构的表:

一小部分域映射器逻辑(几乎相同):

当我保存项目时,一切正常,但是当我尝试获取项目时,我在 CollectionOne(ChildA 类型)中获得了其中两个,而在第二个中出现错误:

非法访问加载集合我在sql中看到的:

没有鉴别器字段。有可能修复它吗?

0 投票
1 回答
332 浏览

c# - 无法在 EF 6 上使用 Fluent API 创建 TPH

我为一个类似 Google Forms 的项目建模。下面的实体非常简单明了(我猜),如下所示。

问题类型:

答案类型:

豆在哪里:

对于我可以有的问题,相反,一个Question对象和一个QuestionOption用于客观问题。如果是这样,我们将需要Answer里面的所有 3 个对象Question,这对我来说听起来不对(需要识别问题类型,然后相应地访问其答案成员,如isand ascasts)。作为一种解决方法,我决定使用TPH方法将问题分成上面定义的 3 个对象,并拥有单独的 Answer 成员。

一切似乎都只适用于 1 个条件:所有流畅的 API 设置必须在void OnModelCreating(DbModelBuilder modelBuilder)类中完成DbContext(我已经覆盖了它)。这是一个问题,因为我正在为每个实体对象分离所有配置并像这样添加它们:

这些是配置对象:

为什么方法 1 有效,而方法 2 无效?

编辑:

我删除了配置继承,它“几乎”工作(见下文)。像这样:

并像这样注册它们:

0 投票
1 回答
75 浏览

c# - 将引用属性映射到抽象父级

我在企业应用程序中有一个复杂的对象层次结构。我会尽量保持简单、抽象,但仍能代表我正在处理的内容。

我的项目处理同一类型对象的几种样式。为此,我们为实体对象实现了 TPT 结构:

现在我正在做一种新的类型。我们在对象上有共同的属性,但是根据子类型需要一些不同的细节集。为此,我设置了 TPH,因为该类型的属性在所有子类型中都是相同的。唯一的区别是需要哪些细节对象。

我将它映射到我的 DbContext 中,如下所示:

此时,我已经使用了集成测试并成功检查了我可以保存到两个表中。

现在,我想添加细节:

然后我将这些引用属性添加到我的适当NewWidget对象中。

我试着执行这个,假设典型的映射可以工作,并得到以下错误:

System.Data.Entity.Infrastructure.DbUpdateException:保存不为其关系公开外键属性的实体时发生错误。EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常。有关详细信息,请参阅 InnerException。---> System.Data.Entity.Core.UpdateException:无法确定相关操作的有效顺序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。

有了这个,我明白它没有正确的关系方向和映射键。所以我再次在 DbContext 中明确设置它:

但是,这给了我错误:

System.InvalidOperationException:ReferentialConstraint 中的依赖属性映射到存储生成的列。列:'WidgetId'。

我看了一个“其他一些”“问题”,这些答案都没有帮助我。

作为最后的努力,我尝试使用.WithRequiredDependent()需要 Func 的重载。但是,因为它与我正在映射的类型不完全相同,因为我将属性作为抽象基础,所以它会抱怨。因此,我尝试像这样投射它:

但是,这也会产生错误:

类型“...Foo”的属性“Widget”上的 ForeignKeyAttribute 无效。在依赖类型“NewWidgetA”上找不到外键名称“WidgetId”。Name 值应该是逗号分隔的外键属性名称列表。

这让我相信我无法用抽象属性做我想做的事情。有没有办法映射我缺少的这种关系?我不想为每个都有一个特定的参考属性,因为我知道一两个月内会有更多类型,并且属性列表会变得笨拙。

0 投票
2 回答
111 浏览

c# - 使用 TPH 在 Entity Framework 中找出具有主键的类型

我有以下情况:

我正在使用 Entity Framework with Table per Hierarchy,因此数据库中将有一个包含CheckingAccount -Records 和SavingAccount -Records 的表,并且该表将包含一个名为Discriminator的列,其中填充了值“CheckingAccount”或“SavingAccount”。

现在我想将一个主键(Guid)作为我的输入,并找出这个主键所属的记录类型。

我有一个给定的 Guid,想知道这个 Guid 的记录是 CheckingAccount-Record 还是 SavingAccount-Record。

我试过这样的事情:

但是,这会导致 InvalidOperationException:当记录是 SavingAccount 时,它会说

“当请求 CheckingAccount 类型的实体时,找到的实体属于 SavingAccount 类型。”

当我调用第一个 Find() 方法时。

我怎样才能找出只给定主键的类型和它可能属于的两种类型?

0 投票
1 回答
83 浏览

c# - 使用 EF 加载显式实体(不是扩展它的实体)

我们在我们的应用程序中采用了代码优先的方法。我们有一个类似这样的简单层次结构:

SuperSpecializedPerson 扩展 SpecializedPerson 扩展(抽象)Person

我们有 SuperSpecializedPerson 和 SpecializedPerson 的两个存储库。查询 SuperSpecializedPerson 时,返回的实体是想要的实体。查询 SpecializedPerson 时,将返回所有 SpecializedPerson 以及 SuperSpecializedPerson(作为 SpecializedPerson 的实例)。这是我的问题。

检查 SQL 查询是看到这部分代码WHERE ([Extent1].[Discriminator] IN (N''SuperSpecializedPerson '',N''SpecializedPerson'')),我想有WHERE ([Extent1].[Discriminator] IN (N''SpecializedPerson''))

我怎样才能只获得 SpecializedPerson?

[编辑] 我将为我的问题提供更多背景信息,以确定我是否完全走错了路:
我必须将相同类型的 DTO 列表从后端返回到前端。正在根据指定的映射配置文件使用 Automapper 创建 DTO。
首先我查询 SuperSpecializedPerson,将它们映射到 DTO,然后对 SpecializedPerson 进行同样的操作并将两个列表连接起来。合并后,我得到了所有 SuperSpecializedPerson 的两个实例(一次只有 SpecializedPerson 属性)。
所描述的模型是根据当前知识定义的,并且将来可能会有第二个类扩展 SpecializedPerson。

0 投票
0 回答
46 浏览

c# - net core 2 EF 正在复制具有 TPH 继承的行

我目前正在开发 net core 2 应用程序。

我创建了一个“商品”抽象类。

两个继承类 Product 和 Batch。

如您所见,一个批次包含一组产品。

一切正常,EF 使用 TPH 继承模型创建了一个单表“商品”。批次中的产品具有 BatchId(由 EF 创建的列),鉴别器列运行良好(即使我无法在我的代码中访问它)等等......

我的问题是,当我执行 GetAll 请求时,我会两次获得所有批次产品。

如您所见,我有两个产品(id 85 和 id 86)包含在我的批次中并包含在我的“商品”查询中。它们是相同的,它们不应该存在于批次之外。

数据库截图

我设法不使用 foreach 从我的商品查询中删除它们

结果

这按预期工作,我的产品 85 和 86 没有显示。但正如您可能知道的那样,foreach 正在影响表演。使用 foreach,在 1200 行的表上获得结果大约需要 10 秒。没有,0.2 秒。

我的问题是如何向我的用户发送我的所有商品,即产品和批次,而不会将属于批次的产品发送两次(仅在批次内,不像批次外的产品),而不“过滤”我的查询有一个foreach。

我已经尝试过其他一些事情,比如在我的模型构建器周围玩等等......但没有成功......

也许我在那里遗漏了一些明显的东西,因为我是新手,但我目前遇到了这个性能问题。

如果您需要任何澄清、详细信息或其他任何内容,请告诉我。

谢谢你读我。

编辑:添加了一个数据库屏幕截图,以显示它是否有助于理解问题。

编辑 2:添加了 foreach 的输出。

编辑3:编辑了问题......有点。

0 投票
1 回答
233 浏览

sql-server - SQL Server TPH(按层次结构表)根据类型自动增加多列

我们目前在Entity Framework中使用TPT(Table Per Type),这很慢,因为我们大约有20个表,当它们被查询时,Entity Framework会创建一些非常慢的伪装SQL。

每个表都有一个自动递增整数列,这允许每种类型都有一个按类型递增的数字。这是客户想要的。现在我们想要移动到性能更高的 TPH,我们需要将所有这些表列移动到一个表中。

我们如何才能根据下面的结果中的类型来自动增加列?

例如

当前工作任务

当前工作任务

这是我们想要的 TPH 表结构,如您所见,我们希望任务编号根据任务类型递增。

我想知道我们是否使用播种台,但非常感谢任何解决方案

非常感谢

安德鲁

0 投票
0 回答
46 浏览

entity-framework - 如何在 EF TPH Code First 中阻止创建冗余 FK 约束

我在一些项目EF代码中首先使用TPH(在部分类中)我有这样的类:

当我尝试从控制台通过 Update-Database -Script 生成 sql 代码以创建数据库时,我收到此 SQL 作为结果:

最后一个 FK 约束是多余的,如果我尝试添加新的 EstimateProjectPriceList 会给我带来麻烦。我的问题是如何通过 OnModelCreating 中的一些代码 Data Annotations 或 Fluent Api 停止创建这个 FK ?

谢谢任何帮助..

0 投票
1 回答
19 浏览

c# - 当多个实体派生自一个公共实体并保存在同一个表中时,如何按实体查询对象

假设我有一个包含 2 个子类的父类,配置如下:

那么如何根据子类型拉取数据呢?

在表中,我看到一个名为Discriminator值的列,例如ChildAChildB。但是,在 上没有这样的属性x.Discriminator

0 投票
0 回答
501 浏览

c# - EF Core 2.1 可区分类型与 Many->Many 集合

我有一个大致如下线的模型:

我正在使用的系统需要以下内容:

  • 表达式和组是唯一可识别的,并且应该是共享对象(例如,多个组可以引用相同的表达式,以及相同的组)

我已经设置了这个配置,HasMany(group => group.Expressions).WithOne()因为它是一个组可以有许多表达式组件(基本类型)的情况,但是向后没有有意义的导航属性。

这导致每个组件上都有一个列来跟踪它属于哪个组,当我添加一个引用现有表达式的新组时,引用它的前一个组会丢失该引用,而新的组会接管。

生成的 SQL 结构和值

我需要能够让多个组引用相同的表达式(或组),但是从表达式转到组没有领域原因。

解决这个问题的正确方法是否只是针对表达式引入一个集合导航属性以链接到它所属的组(/ s)?

还是有一些奇怪的许多<->我需要引入许多变化?


下面是这些类型的实体配置。

值得注意的是,还有另一种类型需要引用许多组(只是组),但再一次,不需要反过来。