问题标签 [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.

0 投票
1 回答
1738 浏览

.net - Entity Framework 6 & TPH 继承:默认将同名属性映射到同一列

从 EF6 开始,可以在使用 Table Per Hierarchy 继承配置实体映射时执行以下操作:

BatteryLevel不是Device基类的一部分-它是为实现接口契约而实现的派生类的属性。

是否可以将此作为默认行为,而不是必须为每个派生类添加新映射?

0 投票
1 回答
159 浏览

c# - 尝试在子类型之间创建关系时出现 EF-Migrations FK 错误

在我的域模型中,我有一个Company抽象的基类和由 Company 的子类表示的三种不同的 Company 类型:

同样,我还有另一个基类,它定义了 Funds Account 和两个实现特定属性的子类型:

我对这些类型的映射策略是逐层表,因此在我的 DbContext 类中,我只为基类定义 DbSet,这使我能够执行多态和非多态查询:

现在是棘手的部分,我的要求是:

  • 供应商不得有资金账户
  • 经销商必须有一个 DealerFundsAccount
  • 零售商必须有一个 RetailerFundsAccount

应该很简单:

但是 EF Migrations 在尝试更新数据库架构时惨遭失败。由于 TPH,Dealers 和 Retailers 映射到同一个 Company 数据库表,而 RetailerFundsAccounts 和 DealerFundsAccounts 映射到 FundsAccount db 表,所有这些都是需要的,但由于我在子类型之间定义了两个一对一的关系,EF尝试定义 FundsAccount Id 字段的外键两次

我知道我可以通过为每个具有资金帐户的 Company 表定义一对多关系来破解解决方案,并使用其 FK 中的唯一约束来防止一对多行为,但我想与你核实一下有一个更好的解决方案。

0 投票
2 回答
1824 浏览

c# - 实体框架6中的多对多关系+ TPH继承问题

我遇到了 EF6 的问题,尽管我相当确定这适用于支持此类映射的先前版本。我担心我知道手头问题的答案,但我希望我做错了什么,或者有比我在这里提出的更好的解决方法。为了清楚起见,所有类都被删除了。

所以我有

如您所见,它定义了多对多关系。我已经定义了两个派生自SoftwareFirmware的类,恰当地命名为

我正在使用 Table Per Hierarchy 继承,因此SoftwareFirmware与鉴别器列存储在同一个表中。最后,我已经映射了 derivedDbContextOnModelCreating方法中的关系

手头的问题是实体框架似乎不支持此映射的继承,因为当 EF 尝试生成数据库时我收到以下信息:

DeviceTypes:FromRole:NavigationProperty 'DeviceTypes' 无效。AssociationType 'DeviceType_AvailableSoftwareVerions' 中 FromRole 'DeviceType_AvailableSoftwareVerions_Target' 的类型 'Software' 必须与声明此 NavigationProperty 的类型 'SoftwareFirmware' 完全匹配。

从这里我收集到一个继承自的类型SoftwareFirmware对于 NavigationProperty 来说不够好,它必须是一个SoftwareFirmware类型。如果我将DeviceType集合从SoftwareFirmware基类中取出并在每个派生类中复制它,那么一切正常,但这肯定不太理想。

最后,我的问题是 - 是否有另一种方法来配置它,以便我可以将导航属性保留在我的基类中?如果没有,是否有比我描述的更清洁的解决方法?


更新:所以似乎 SQL Server Management Studio 做错了,因为我之前绘制了数据库图表,而没有使用表达式的 WithMany 的重载版本,并且它不包括联结表。即使数据库已被删除并重新创建,SSMS 似乎在添加新图表方面也不能很好地处理模式更改 - 它必须重新启动。严重的痛苦,但我离题了......

作为最后的努力,我恢复到WithMany映射的无参数版本,通过重新启动应用程序删除并重新创建数据库,重新启动 SSMS,然后看!连接表已创建。我需要做的就是Ignore为基SoftwareFirmware类的DeviceTypes属性添加一个,并干净地生成所有内容。所以我的 FluentAPI 映射代码如下所示:

它生成了这个模式 - 几乎正是我想要的模式(忽略额外的属性):

在此处输入图像描述

但是,由于无参数调用WithMany仅在一侧连接了导航属性,因此更新Software.DeviceTypes并且Firmware.DeviceTypes不被 EF 跟踪,所以我回到了我开始的地方。

0 投票
1 回答
579 浏览

c# - Code First EF 6 Table Per Hierarchy SQL 查询生成问题

我有一个带有几个继承类的模型。我有一个 4 级层次结构:

这只是层次结构之一。至少还有 3 个,它们不太复杂。它们之间有几种关系,几乎所有的类都有7个以上的属性。

现在,我使用每个类型的表,但是当我执行简单的 LINQ 查询时:

AA 包含所有子类。当数据库为空时,完成这个简单的测试大约需要 25 秒。使用四级类执行相同的 LINQ 查询只需 2 秒。

我试图迁移到每个层次结构的表,默认情况下,数据库生成良好,带有一个列鉴别器,但相同的测试需要永远...... LINQ 查询永远不会执行,甚至没有完成。所有表格都会发生这种情况。

有什么建议吗?

0 投票
1 回答
4199 浏览

c# - EF6 - 使用基类属性的派生类中的 TPH 外键映射

我将 Entity Framework 6.0.2 与现有数据库一起使用,其中标签存储在单个表中,如下所示:

  • Id: int, 主键
  • TagType: 字符串,确定标签的类型,“usertag”或“movietag”
  • ItemId: int,包含所引用项目的 ID(用户 ID 或电影 ID)

以下类描述了这种情况:

如您所见,我的派生类具有导航属性,这些ItemId属性由基类中的属性值支持。我的映射如下:

现在,当我尝试使用以下代码使用此映射时,出现异常:

抛出的异常是:

Unhandled Exception: System.InvalidOperationException: The foreign key component 'ItemId' is not a declared property on type 'UserTag'. Verify that it has not been explicitly excluded from the model and that it is a valid primitive property

是的,该ItemId属性未在 type 上声明,但它是从基类UserTag继承的。Tag在我看来,这种映射应该是可能的。这是 Entity Framework 6 中的错误还是限制?

0 投票
4 回答
3999 浏览

c# - Entity Framework 一对多与每个层次结构的表创建每个子类的一个外键列

我有一个Garage包含CarsMotorcycles。汽车和摩托车都是Vehicles。他们来了:

为什么 Car 和 Motorcycle 各有一个 GarageId 和 Garage 属性?如果我将这些属性推送到 Vehicle 超类,EF 会抱怨并告诉我导航属性必须驻留在具体类中。

继续前进,这是我的 DbContext:

这是一个玩我的玩具的小程序:

程序运行,并生成以下Vehicles表:

Car 和 Motorcycle 都有自己的 GarageId 和 Garage 属性,似乎每个子类都在创建自己的车库外键。我如何告诉 EF(通过流利的 api,如果可能的话) Car.Garage 和 Motorcycle.Garage 是同一件事,应该使用同一列?

这是我想要的Vehicles表,当然:

0 投票
1 回答
1026 浏览

java - 如何使用休眠获取每个层次结构表中具体类的所有对象?

我正在使用 Spring MVC 和 Hibernate 使用 Netbeans(Maven Web 应用程序)开发一个 Web 应用程序。我有一个带有多个具体类(父、子等)的抽象类(用户)。我选择了一个按层次结构的表结构,以便我有 1 个表,其中包含这些具体类的所有对象。但是我找不到获取某个具体类的所有对象的方法。我收到以下错误:

java.lang.IllegalArgumentException:为 TypedQuery [domain.Parent] 指定的类型与查询返回类型 [class domain.User] 不兼容

任何知道我如何投射这些物体的人?

0 投票
1 回答
132 浏览

c# - 实体框架:多列上的每个层次结构表

我已经在包含订单项目的旧表上设置了一个视图。在我的程序中,我想区分电话订单、wifi 订单、互联网订单和杂项订单。旧表没有鉴别器列,但是,您可以按产品代码字符串对订单进行分组。有没有办法从这个设计中创建一个表?

例子:

  • 电话代码: 30000-01、30000-02、30000-05、...
  • Wifi 代码: 30000-17、30000-52、...
  • 等等

编辑:我仍然需要一个订单视图来显示列出的部门的所有这些订单。

0 投票
1 回答
910 浏览

c# - 如何根据字段值自动创建具体类

考虑这个例子:

数据库(类似于 Stackoverflow)有一个表格,其中问题和答案在同一个表格中,可按PostType字段区分。我想取回最新帖子的列表,无论是问题还是答案。

由于问题和答案具有共同的属性,因此两个类都继承自一个抽象类ContentBase。他们只添加了与每种类型相关的几个附加字段。

IList<ContentBase>当单个项目是具体类型QuestionAnswer基于条件字段时,如何获取投射到的内容项目列表。

然后我的存储库会有一个电话:

我正在使用 PetaPoco/NPoco,但我想如果使用 Dapper 也会出现同样的问题。

问题

如何指示 DAL 根据特定字段的值(ContentType在这种情况下)实例化正确的具体类型?

解释

我应该按照这些思路做一些事情:

但我不能因为ContentBase是一个抽象类。如果我将此行更改为:

它仍然行不通,因为我InvalidOperationException从 NPoco 那里得到了一条说Can't auto join User

我想这样做的唯一方法是创建一个继承自的新类PocoData并提供我自己的GetFactory委托实现。我认为。我认为没有任何其他可扩展点可以实例化具体的 POCO,而且我不确定我是否应该这样做以及如何处理抽象祖先类。

0 投票
1 回答
461 浏览

mysql - GRAILS:使用域子类

使用具有以下版本的 Grails:

我有一个要遵循的域模型。我在编程之前在 MySQL 中构建了表。
在模型中,我有以多对多关系绑定到人(Persons)的 Insertion_orders。此关系由 Insertion_orders_persons 定义,person_id 和 location_id 定义 Insertion_orders_persons 中的条目。此外,还有一个类型值是 ENUMed,可以是 Trafficker、Advertiser、Agency 或(或)Salesperson。一个(或多个)贩运者总是会出现,但其余的可能、可能不存在或具有许多此类关联。我正在尝试根据类型将它们绑定到 Insertion_orders 模型:

我正在尝试使用继承和鉴别器值来实现这一点。

问题是当我尝试加入扩展类时(如在 Insertion_orders 类中的 hasMany 中),Grails 无法启动并生成以下内容:

作为附加信息,无论我如何尝试访问子类或子类组合,我都会收到相同的错误。

这似乎是一个非常基本的功能。有人可以告诉我我错过了什么或做错了什么吗?