问题标签 [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 回答
166 浏览

c#-4.0 - 实体框架 TPH 和与具体类的一对多关系

我一直在 MVC5 网站上工作以管理保险单,并被我认为是设计问题所困扰。我首先有一个代码,TPH 实体情况,带有以下称为策略的抽象类:

和两个具体的类如下:

并且,最后一个类与上述两个具体类具有一对多关系:

业务要求是,如果客户想要保护伞保险,如果他们只想要保护伞保险,他们要么购买保护伞保单,要么如果他们想要保护伞保险和责任保险(比如那些希望您捆绑房主和汽车保单的广告),则购买一揽子保单。描述客户拥有多少保险的类别(Umb 类别)是相同的,无论客户购买的是独立保单还是套餐中的伞式保险。

当我尝试创建一个新的 Umb 并将策略(无论是保护伞还是包)添加到虚拟 Policy 属性,然后尝试从具体策略类的列表中查看 Umb 对象列表时,没有显示。

查看数据库后,当我进行数据库迁移时,似乎有三个关键列:UmbrellaPolicy_PolicyID、PackagePolicy_PolicyID 和 Policy_PolicyID。它成功地将正确的策略 ID 添加到 Policy_PolicyID 列,但我猜实体框架会根据我正在使用的具体类(即在强类型视图中)查看 Umbrella 或 Package 列。我觉得我遗漏了一些明显的东西,或者我走上了一条摇摇欲坠的实现道路。有人可以指出我的任何建议或读物都会很棒。谢谢!

0 投票
1 回答
132 浏览

c# - 实体框架 TPH 工厂方法

我目前有一个 MVC5 站点,它与类的 TPH 关系如下:

我的问题是:1)我在成人评论控制器中创建新的成人评论 2)我使用 db.Products.find(id) 将产品添加到评论的产品虚拟属性 3)我转到视图我刚刚添加了评论的产品,发现有 0 条评论(假设我尝试向玩具添加评论,但请记住,当我将其添加到虚拟财产时,我没有将其作为玩具) 4 ) 当我进入数据库时​​,adultcomment 表中有 3 个关键列:一列产品,一列玩具,一列工具。正确的 id 放置在 product 列中,其他为 null

在将产品添加到成人评论的虚拟财产之前,我是否必须将产品转换为玩具或工具?

为什么成人评论表中有额外的列,是否可以合并到一个 id 列(毕竟,我的 tph 中有一个 products 表),如果可能的话我应该这样做吗?

0 投票
0 回答
107 浏览

sql-server - 在 EF 6.1 中从 TPT 迁移到 TPH

由于性能问题,我需要将我的对象层次结构从 TPT 迁移到 TPH 结构。是否有将数据从一种结构迁移到另一种结构的最简单方法。对象层次结构包含大约 15 个类,我不想手动编写迁移脚本。可视化工具,或某种具有流畅界面的迁移工具会很好。谢谢你。

PS服务器是sql server 2014。

0 投票
0 回答
641 浏览

c# - 使用 Entity Framework 6 在 2 个不同的鉴别器字段上实现嵌套 TPH

我正在使用 EF6,首先从 edmx 迁移到 Code。我从现有数据库进行了逆向工程,我试图重现我之前的模型,其中嵌套 TPH 在名为“Contacts”的表上完成,该表分别具有 2 个不同的字段“Type”和“SubType”作为第一个和二级鉴别器。

我想要这样的东西:

我已将 Contact、Model 和 Customer 类编码为 Abstract 和 BookingModel、ScoutingModel、Agency、Client、Service 作为具体类,但不包括“类型”和“子类型”字段,因为它们是鉴别器。

这是映射代码:

但这不起作用,我收到一个错误,例如

(52,10):错误 3023:从第 52、68、75、82、89、98、106、729、747 行开始映射片段时出现问题:列 Contact.Type 没有默认值且不可为空。存储实体数据需要列值。

数据库中的“类型”和“子类型”字段是 Tinyint 可以为空的,没有默认值。我也尝试将它们更改为可为空或提供默认值,但它不会更改产生的错误。

我在设置映射时做错了什么,还是我选择了错误的方式来面对这种情况?

0 投票
3 回答
403 浏览

oracle - EF6 TPH 与 Oracle

我目前在尝试首先使用 EF6 代码来映射现有 Oracle 数据库并为每个层次结构创建一个表时遇到一些问题。我要映射的表的脚本如下所示:

它是 Oracle 服务器上包含数据库连接信息的表 - 每个 Oracle 数据库信息的 CN_PROVIDER = 0,而 SQL 数据库信息的 CN_PROVIDER = 1。

因此,我很自然地使用

但是,当我尝试访问数据时,总是会收到以下错误:

我已经尝试使用以下方法进行映射:

而且我束手无策 - 有谁知道是否: 1- 是否可以使用数字列作为鉴别器在 Oracle 中实现 TPH?2-我错过了什么吗?

现在我将继续(并使用我的存储库层上的工厂实现层次结构)但我愿意尝试提出的任何解决方案 - 在此先感谢!

0 投票
1 回答
70 浏览

entity-framework - 实体框架将删除+插入替换为更新。如何关闭它

我想删除数据库中的一行并使用相同的 Id 再次插入它,这听起来很荒谬,但这是场景:

域类如下:

实体上下文是

现在可以执行这段代码来演示这一点(在下面的代码中用注释描述)

如何更改此实体行为以便删除和插入而不是更新?

0 投票
1 回答
2238 浏览

c# - 使用 TPH 的实体框架的多级继承

我正在使用 Entity Framework 在现有遗留数据库的新项目中创建 Table Per Heirachy 数据模型。这意味着我们不拥有数据库,因此我需要一个不涉及向 OrderDiscount 表添加列的解决方案。

我的数据模型中有以下结构:

有一个预先存在的鉴别器列来区分具体类型。它被调用DiscountType并且可以保存值PercentageOffPromoDiscountFreeShippingPromoDiscountSaleDiscount

我的项目中有以下映射,不幸的是,它不起作用。

我看到的例外是:

EntityTypes SellerOrderDiscountBase、SaleOrderDiscount、FreeShippingOrderDiscount、PercentageValueOrderDiscount 被映射到表 OrderDiscountBase 中的相同行。映射条件可用于区分这些类型映射到的行。

我已经看到人们在旧版本的 Entity Framework 中通过添加第二个鉴别器列来解决这个问题,但正如我所说,我无法对数据库进行更改。

我要求 EF 做的事情听起来并不难,所以我假设我刚刚错误地配置了我的实体。

0 投票
1 回答
96 浏览

c# - 如何从 TPH 表中获取主列表

我正在为我的代码优先模型使用按层次结构表 (TPH) 结构。我有一个基本模型客户:

我有几个模型继承客户:

等等。要获取我使用的住宅客户列表:

我需要帮助的是如何获得主客户列表作为超集?正如预期的那样,在 Customer 上调用 .ToList() 扩展方法只会返回 Id 属性。使用 SqlDataAdapter 我可以返回一个表...</p>

我真正需要的只是来自数据库的客户表的原始内容来填充组合框。仅使用 EntityFramework 就没有更清洁的方法吗?

0 投票
1 回答
929 浏览

c# - EF 将实体类型的属性映射到具有 TPH 继承的多个表

我想将实体类型的映射属性映射到数据库中的多个表(实体拆分),同时使用Mapping the Table-Per-Hierarchy (TPH) Inheritance,因此我的模型映射代码如下:

基于以下底层数据库模式:

但是,当 EF 尝试执行我的查询时:

抛出以下异常消息:

运行 SQL 配置文件,它似乎试图在表上使用PersonType具有值的字段上的谓词,而不是在我的鉴别器真正所在的表上使用谓词。Cdbo.Customerdbo.Person

如果我使用一个或另一个功能,即仅继承或仅附加表映射,那么它可以工作,但是我放弃了我的一些要求。

我正在做的事情可以用 EF Fluent API 完成吗?

谢谢你的时间。

0 投票
1 回答
675 浏览

c# - 自定义鉴别器列名称的简单方法

我通过 ODP.NET 将 EF6 与 Oracle 一起使用。而且我需要(而且我无法更改它)所有 db 对象都是大写的。

我添加了一些约定,现在我的所有表、列、外键等都是大写的。EF 为两个 TPH 层次结构生成的除鉴别器之外的所有列。

我的问题是如何告诉 EF 重命名此列?我知道Requires(...).HasValue(...)语法的方式,但我不想为每种类型(以及将来的每个新层次结构)指定鉴别器值。我对默认值感到满意,只想重命名列本身。