问题标签 [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.
c#-4.0 - 实体框架 TPH 和与具体类的一对多关系
我一直在 MVC5 网站上工作以管理保险单,并被我认为是设计问题所困扰。我首先有一个代码,TPH 实体情况,带有以下称为策略的抽象类:
和两个具体的类如下:
并且,最后一个类与上述两个具体类具有一对多关系:
业务要求是,如果客户想要保护伞保险,如果他们只想要保护伞保险,他们要么购买保护伞保单,要么如果他们想要保护伞保险和责任保险(比如那些希望您捆绑房主和汽车保单的广告),则购买一揽子保单。描述客户拥有多少保险的类别(Umb 类别)是相同的,无论客户购买的是独立保单还是套餐中的伞式保险。
当我尝试创建一个新的 Umb 并将策略(无论是保护伞还是包)添加到虚拟 Policy 属性,然后尝试从具体策略类的列表中查看 Umb 对象列表时,没有显示。
查看数据库后,当我进行数据库迁移时,似乎有三个关键列:UmbrellaPolicy_PolicyID、PackagePolicy_PolicyID 和 Policy_PolicyID。它成功地将正确的策略 ID 添加到 Policy_PolicyID 列,但我猜实体框架会根据我正在使用的具体类(即在强类型视图中)查看 Umbrella 或 Package 列。我觉得我遗漏了一些明显的东西,或者我走上了一条摇摇欲坠的实现道路。有人可以指出我的任何建议或读物都会很棒。谢谢!
c# - 实体框架 TPH 工厂方法
我目前有一个 MVC5 站点,它与类的 TPH 关系如下:
我的问题是:1)我在成人评论控制器中创建新的成人评论 2)我使用 db.Products.find(id) 将产品添加到评论的产品虚拟属性 3)我转到视图我刚刚添加了评论的产品,发现有 0 条评论(假设我尝试向玩具添加评论,但请记住,当我将其添加到虚拟财产时,我没有将其作为玩具) 4 ) 当我进入数据库时,adultcomment 表中有 3 个关键列:一列产品,一列玩具,一列工具。正确的 id 放置在 product 列中,其他为 null
在将产品添加到成人评论的虚拟财产之前,我是否必须将产品转换为玩具或工具?
为什么成人评论表中有额外的列,是否可以合并到一个 id 列(毕竟,我的 tph 中有一个 products 表),如果可能的话我应该这样做吗?
sql-server - 在 EF 6.1 中从 TPT 迁移到 TPH
由于性能问题,我需要将我的对象层次结构从 TPT 迁移到 TPH 结构。是否有将数据从一种结构迁移到另一种结构的最简单方法。对象层次结构包含大约 15 个类,我不想手动编写迁移脚本。可视化工具,或某种具有流畅界面的迁移工具会很好。谢谢你。
PS服务器是sql server 2014。
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 可以为空的,没有默认值。我也尝试将它们更改为可为空或提供默认值,但它不会更改产生的错误。
我在设置映射时做错了什么,还是我选择了错误的方式来面对这种情况?
oracle - EF6 TPH 与 Oracle
我目前在尝试首先使用 EF6 代码来映射现有 Oracle 数据库并为每个层次结构创建一个表时遇到一些问题。我要映射的表的脚本如下所示:
它是 Oracle 服务器上包含数据库连接信息的表 - 每个 Oracle 数据库信息的 CN_PROVIDER = 0,而 SQL 数据库信息的 CN_PROVIDER = 1。
因此,我很自然地使用
但是,当我尝试访问数据时,总是会收到以下错误:
我已经尝试使用以下方法进行映射:
而且我束手无策 - 有谁知道是否: 1- 是否可以使用数字列作为鉴别器在 Oracle 中实现 TPH?2-我错过了什么吗?
现在我将继续(并使用我的存储库层上的工厂实现层次结构)但我愿意尝试提出的任何解决方案 - 在此先感谢!
entity-framework - 实体框架将删除+插入替换为更新。如何关闭它
我想删除数据库中的一行并使用相同的 Id 再次插入它,这听起来很荒谬,但这是场景:
域类如下:
实体上下文是
现在可以执行这段代码来演示这一点(在下面的代码中用注释描述)
如何更改此实体行为以便删除和插入而不是更新?
c# - 使用 TPH 的实体框架的多级继承
我正在使用 Entity Framework 在现有遗留数据库的新项目中创建 Table Per Heirachy 数据模型。这意味着我们不拥有数据库,因此我需要一个不涉及向 OrderDiscount 表添加列的解决方案。
我的数据模型中有以下结构:
有一个预先存在的鉴别器列来区分具体类型。它被调用DiscountType
并且可以保存值PercentageOffPromoDiscount
,FreeShippingPromoDiscount
或SaleDiscount
。
我的项目中有以下映射,不幸的是,它不起作用。
我看到的例外是:
EntityTypes SellerOrderDiscountBase、SaleOrderDiscount、FreeShippingOrderDiscount、PercentageValueOrderDiscount 被映射到表 OrderDiscountBase 中的相同行。映射条件可用于区分这些类型映射到的行。
我已经看到人们在旧版本的 Entity Framework 中通过添加第二个鉴别器列来解决这个问题,但正如我所说,我无法对数据库进行更改。
我要求 EF 做的事情听起来并不难,所以我假设我刚刚错误地配置了我的实体。
c# - 如何从 TPH 表中获取主列表
我正在为我的代码优先模型使用按层次结构表 (TPH) 结构。我有一个基本模型客户:
我有几个模型继承客户:
等等。要获取我使用的住宅客户列表:
我需要帮助的是如何获得主客户列表作为超集?正如预期的那样,在 Customer 上调用 .ToList() 扩展方法只会返回 Id 属性。使用 SqlDataAdapter 我可以返回一个表...</p>
我真正需要的只是来自数据库的客户表的原始内容来填充组合框。仅使用 EntityFramework 就没有更清洁的方法吗?
c# - EF 将实体类型的属性映射到具有 TPH 继承的多个表
我想将实体类型的映射属性映射到数据库中的多个表(实体拆分),同时使用Mapping the Table-Per-Hierarchy (TPH) Inheritance,因此我的模型映射代码如下:
基于以下底层数据库模式:
但是,当 EF 尝试执行我的查询时:
抛出以下异常消息:
运行 SQL 配置文件,它似乎试图在表上使用PersonType
具有值的字段上的谓词,而不是在我的鉴别器真正所在的表上使用谓词。C
dbo.Customer
dbo.Person
如果我使用一个或另一个功能,即仅继承或仅附加表映射,那么它可以工作,但是我放弃了我的一些要求。
我正在做的事情可以用 EF Fluent API 完成吗?
谢谢你的时间。
c# - 自定义鉴别器列名称的简单方法
我通过 ODP.NET 将 EF6 与 Oracle 一起使用。而且我需要(而且我无法更改它)所有 db 对象都是大写的。
我添加了一些约定,现在我的所有表、列、外键等都是大写的。EF 为两个 TPH 层次结构生成的除鉴别器之外的所有列。
我的问题是如何告诉 EF 重命名此列?我知道Requires(...).HasValue(...)
语法的方式,但我不想为每种类型(以及将来的每个新层次结构)指定鉴别器值。我对默认值感到满意,只想重命名列本身。