问题标签 [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.
.net - Entity Framework 6 & TPH 继承:默认将同名属性映射到同一列
从 EF6 开始,可以在使用 Table Per Hierarchy 继承配置实体映射时执行以下操作:
BatteryLevel
不是Device
基类的一部分-它是为实现接口契约而实现的派生类的属性。
是否可以将此作为默认行为,而不是必须为每个派生类添加新映射?
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 中的唯一约束来防止一对多行为,但我想与你核实一下有一个更好的解决方案。
c# - 实体框架6中的多对多关系+ TPH继承问题
我遇到了 EF6 的问题,尽管我相当确定这适用于支持此类映射的先前版本。我担心我知道手头问题的答案,但我希望我做错了什么,或者有比我在这里提出的更好的解决方法。为了清楚起见,所有类都被删除了。
所以我有
和
如您所见,它定义了多对多关系。我已经定义了两个派生自SoftwareFirmware
的类,恰当地命名为
和
我正在使用 Table Per Hierarchy 继承,因此Software
和Firmware
与鉴别器列存储在同一个表中。最后,我已经映射了 derivedDbContext
的OnModelCreating
方法中的关系
手头的问题是实体框架似乎不支持此映射的继承,因为当 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 跟踪,所以我回到了我开始的地方。
c# - Code First EF 6 Table Per Hierarchy SQL 查询生成问题
我有一个带有几个继承类的模型。我有一个 4 级层次结构:
这只是层次结构之一。至少还有 3 个,它们不太复杂。它们之间有几种关系,几乎所有的类都有7个以上的属性。
现在,我使用每个类型的表,但是当我执行简单的 LINQ 查询时:
AA 包含所有子类。当数据库为空时,完成这个简单的测试大约需要 25 秒。使用四级类执行相同的 LINQ 查询只需 2 秒。
我试图迁移到每个层次结构的表,默认情况下,数据库生成良好,带有一个列鉴别器,但相同的测试需要永远...... LINQ 查询永远不会执行,甚至没有完成。所有表格都会发生这种情况。
有什么建议吗?
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 中的错误还是限制?
c# - Entity Framework 一对多与每个层次结构的表创建每个子类的一个外键列
我有一个Garage
包含Cars
和Motorcycles
。汽车和摩托车都是Vehicles
。他们来了:
为什么 Car 和 Motorcycle 各有一个 GarageId 和 Garage 属性?如果我将这些属性推送到 Vehicle 超类,EF 会抱怨并告诉我导航属性必须驻留在具体类中。
继续前进,这是我的 DbContext:
这是一个玩我的玩具的小程序:
程序运行,并生成以下Vehicles表:
Car 和 Motorcycle 都有自己的 GarageId 和 Garage 属性,似乎每个子类都在创建自己的车库外键。我如何告诉 EF(通过流利的 api,如果可能的话) Car.Garage 和 Motorcycle.Garage 是同一件事,应该使用同一列?
这是我想要的Vehicles表,当然:
java - 如何使用休眠获取每个层次结构表中具体类的所有对象?
我正在使用 Spring MVC 和 Hibernate 使用 Netbeans(Maven Web 应用程序)开发一个 Web 应用程序。我有一个带有多个具体类(父、子等)的抽象类(用户)。我选择了一个按层次结构的表结构,以便我有 1 个表,其中包含这些具体类的所有对象。但是我找不到获取某个具体类的所有对象的方法。我收到以下错误:
java.lang.IllegalArgumentException:为 TypedQuery [domain.Parent] 指定的类型与查询返回类型 [class domain.User] 不兼容
任何知道我如何投射这些物体的人?
c# - 实体框架:多列上的每个层次结构表
我已经在包含订单项目的旧表上设置了一个视图。在我的程序中,我想区分电话订单、wifi 订单、互联网订单和杂项订单。旧表没有鉴别器列,但是,您可以按产品代码字符串对订单进行分组。有没有办法从这个设计中创建一个表?
例子:
- 电话代码: 30000-01、30000-02、30000-05、...
- Wifi 代码: 30000-17、30000-52、...
- 等等
编辑:我仍然需要一个订单视图来显示列出的部门的所有这些订单。
c# - 如何根据字段值自动创建具体类
考虑这个例子:
数据库(类似于 Stackoverflow)有一个表格,其中问题和答案在同一个表格中,可按PostType
字段区分。我想取回最新帖子的列表,无论是问题还是答案。
由于问题和答案具有共同的属性,因此两个类都继承自一个抽象类ContentBase
。他们只添加了与每种类型相关的几个附加字段。
IList<ContentBase>
当单个项目是具体类型Question
或Answer
基于条件字段时,如何获取投射到的内容项目列表。
然后我的存储库会有一个电话:
我正在使用 PetaPoco/NPoco,但我想如果使用 Dapper 也会出现同样的问题。
问题
如何指示 DAL 根据特定字段的值(ContentType
在这种情况下)实例化正确的具体类型?
解释
我应该按照这些思路做一些事情:
但我不能因为ContentBase
是一个抽象类。如果我将此行更改为:
它仍然行不通,因为我InvalidOperationException
从 NPoco 那里得到了一条说Can't auto join User。
我想这样做的唯一方法是创建一个继承自的新类PocoData
并提供我自己的GetFactory
委托实现。我认为。我认为没有任何其他可扩展点可以实例化具体的 POCO,而且我不确定我是否应该这样做以及如何处理抽象祖先类。
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 无法启动并生成以下内容:
作为附加信息,无论我如何尝试访问子类或子类组合,我都会收到相同的错误。
这似乎是一个非常基本的功能。有人可以告诉我我错过了什么或做错了什么吗?