问题标签 [table-per-class]

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 回答
307 浏览

c# - 实体框架可以处理映射到具体类继承的完全独立的数据库表吗?

每次在数据库中更改一行时,它都需要将该行的所有列值连同作者和日期戳一起写入审计表。

我以前做过这个确切的事情,但没有涉及到继承关系(另一次是数据库优先,所以维护两个具有几乎所有相同属性的单独类并不是那么烦人,因为 EF 设计者正在这样做我...)

给定 SQL Server 中的以下表结构:

以及 C# 中的以下类:

我无法让 Entity Framework 以这种方式工作。

EF 继承策略的所有信息和示例都假设您有一个抽象类和两个从它继承的具体类。似乎没有人在我想要直接继承 TPT/TPC 的这条船上……

我尝试过的各种组合都会导致以下一个或多个问题:

  • 将 1 个新对象插入 SomeClasses DbSet 时,而不是 SomeClasses 表中的 1 个新行和 Audit_SomeClasses 表中的 1 个新行具有相同的 ImagineABunchOfColumns here 值,我在 SomeClasses 表中得到两个相同的行和 Audit_SomeClasses 中的 1 个新行具有NULL ImagineABunchOfColumns 的表。或者,
  • 第一个 SaveChanges() 因“当 IDENTITY_INSERT 设置为 OFF 时无法在表 'SampleClass' 中插入标识列的显式值”而崩溃。和/或,
  • 第二个 SaveChanges() 调用因“当 IDENTITY_INSERT 设置为 OFF 时无法在表 'Audit_SampleClass' 中插入标识列的显式值”而崩溃。和/或,
  • 尝试从任一 DbSet 中选择会崩溃,并显示“EntitySet 'SampleContext.SampleClasses' 中的所有对象必须具有唯一的主键。但是,'SampleClass' 类型的实例和 'Audit_SampleClass' 类型的实例都具有相同的主键值, 'EntitySet=SampleClasses;Id=[whatever]'。”

基本上我似乎找不到任何 EntityTypeConfiguration 组合使 EF 完全分开处理这两个类;它要么会复制事物,因为它以某种方式执行向后 TPH,要么会将 Audit_SampleClass 上继承的 Id 属性视为主键,即使它不在该类上(我知道某些继承类型存在唯一性问题,但它是甚至没有冲突的键,它是一把钥匙和一把不应该成为钥匙的钥匙),或者它会拒绝将一个或两个钥匙视为身份......

我不希望代码生成能够处理这种情况,但是当引入我自己的类并在它们上显式配置 ToTable 和 HasKey 和 MapInheritedProperties 时,肯定有一种方法可以让它分别处理这两个类而不干扰彼此?

编辑

根据评论中的要求,这里是映射类。取消注释的注释行的各种组合会导致上面的项目符号中列出的不同结果。

0 投票
0 回答
494 浏览

sql - Entity Framework 6 表示两个条目具有相同的主键,但它们位于完全不同的表中

编辑1:所以我没有得到任何地方并尝试了一些不同的东西。我将我的 FriendRequest 类重命名为 FriendRequestBase 并将其抽象化,然后我创建了一个 FriendRequest 类,它继承自 FriendRequestBase 而没有任何额外的字段,所以现在继承如下所示: FriendRequest : FriendRequestBase GroupModRequest : FriendRequestBase

那应该有效,对吧?现在好了,我添加了一个迁移,看看它是否会添加任何更改,是的,由于某种原因,它现在开始删除外键。

那里可能有什么问题?我已经使用 Fluent API 正确设置了外键:

我试图在运行“更新数据库”后为我的数据库播种,这就是我得到的:

EntitySet 'ApplicationDbContext.FriendRequests' 中的所有对象都必须具有唯一的主键。但是,“AW.Models.GroupModRequest”类型的实例和“AW.Models.FriendRequest”类型的实例都具有相同的主键值,“EntitySet=FriendRequests;SenderID=a9540bd6-8532-4c7a-9f68-19d2aeecffcb;接收方 ID=8f50eccf-8ccf-432e-a033-82d933b5e3f5'。

正如我之前提到的,FriendRequests 在一个表中,而 GroupModRequests 在另一个表中,所以这个错误没有意义。不过,我可以猜到为什么会发生这种情况。

GroupModRequests 继承自 FriendRequests,我使用的是 Table-Per-Conrete-Class 方法,这意味着 FriendRequests 有一个表,GroupModRequests 有一个表,并且它具有 FriendRequests 的所有属性以及更多属性。请注意,FriendRequests 不是抽象类。

FriendRequests有一个复合主键,包括:SenderID、ReceiverIDGroupModRequests有一个复合主键,包括:SenderID、ReceiverID 和 GroupID

所以我敢打赌,由于某种原因,它忽略了密钥的“GroupID”部分,并忽略了它们位于不同表中的事实,并在 FriendRequest 具有与 GroupModRequest 相同的发送者/接收者 ID 时引发此错误。

那么如何在 EF6 中解决此问题?我已经用流利的方式设置了这个,但显然这还不够:

复合键如下所示:

注意:我也有“LocationModRequests”,它也继承自 FriendRequests,并且与 GroupModRequests 几乎相同,如果重要的话。

0 投票
0 回答
660 浏览

java - 使用 @Inheritance 和 Joined 策略的休眠错误“找不到对象”

我有 3 个与 Hibernate 一起正常工作的 Java 类(BaseEntity、User、Role)。User 和 Role 都是 BaseEntity 的子类。我有一个用于我的用户的表和一个用于我的角色的表。有一个用于将用户映射到角色的连接表。所有使用的注解都是javax.persistence注解。

由于各种原因,我需要扩展我的模型并为角色创建一个超类。这个超类需要有一个自引用。我的想法是在此处将 @Inheritance 注释与连接策略一起使用,但我不断收到来自 Hibernate 的错误。从我读到的 Hibernate 应该明白,它需要进行连接才能从超类中获取属性。

我得到的错误:

[警告] [18:30:04.004] [] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL 错误:-5501,SQLState:42501 [错误] [18:30:04.004] [] org.hibernate.engine .jdbc.spi.SqlExceptionHelper - 用户缺少权限或找不到对象:ROLE1_.NAME

休眠 SQL 输出:

我正在使用休眠 4.2.19

如您所见,Hibernate 试图从权限表中选择 name 属性的值,这是正确的,但随后抱怨该表上不存在该列。

我该如何解决这个问题?

0 投票
1 回答
838 浏览

c# - 实体框架代码优先 - 继承 - 相关项目集合

我正在尝试使用继承在 EF6 中实现模型

我有以下课程:
基本
评论
页面:基本
博客帖子:基本

Page 和 BlogPost 都以相同的方式使用评论。所以我将 Base 定义为

并且评论类定义如下:

假设我想将数据库设置为“每种类型的表”,因此 Page 和 BlogPost 都有单独的表,每个表都具有自动增量 int PK。

现在 EF 知道 Comment.RelatedItemID 指向哪个表了吗?即页面或博客帖子

无需求助于“每个层次结构的表”来实现这一点的最佳方法是什么?

0 投票
4 回答
92 浏览

java - Hibernate 查询从子类中获取数据

我正在使用每个具体类策略的表

现在创建了三个表

但是当我使用查询数据库时

Hibernate 对所有三个表发出联合查询,为什么会这样?我只是要求车辆。

0 投票
0 回答
543 浏览

java - 覆盖 InheritanceType.TABLE_PER_CLASS 中的列名

使用 TABLE_PER_CLASS 继承时,有什么方法可以覆盖列名?

该文档说:
“这种方法的局限性在于,如果将属性映射到超类上,则所有子类表上的列名必须相同。” :(

@AttributeOverride 不起作用

例子:

和一些示例查询

生产

有没有办法强制 Hibernate 在子子查询中使用一些自定义属性名称?问题是我有一些遗留数据库,其中包含几乎相同数据但一些列名不同的表......

编辑:我最终得到了包含重命名列名的视图

0 投票
1 回答
244 浏览

hibernate - 当我在 Hibernate 中使用单向一对多和 Table Per Class InheritanceType 时出现问题

我有一个类Person和一个包含三个类的类层次结构,当我将 InheritanceType.TABLE_PER_CLASS 用于类层次结构时,它遇到了“批量更新”问题。请看下面的代码。AbstractBase是类层次结构的基类。

测试代码:

输出:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1"

Manager我通过hibernate sql发现Hibernate没有更新表。当我将 InheritanceType 更改为 时InheritanceType.JOINED,代码运行良好。我错过了单向一对多配置中的某些内容吗?

- - - - - - - - - - - - - - - - - 更新 - - - - - - - - -----------------

在“Person”类中,我在一对多注释中将@JoinColumn 更改为@JoinTable,测试代码运行良好。当@JoinColumn 的目标类被“InheritanceType.TABLE_PER_CLASS”注解时,是否有遗漏配置?

请看下面的详细注释:

- - - - - - - - - - - - - - - - - - -更新 - - - - - - --------------------

我用 Hibernate 5.2.5 Final 尝试了代码,问题仍然存在。

0 投票
1 回答
571 浏览

c# - 实体框架 TPC 外键关系

所以我已经实现了每个具体类的表来处理继承层次结构,但是我在导航属性方面遇到了麻烦。

我的模型结构如下:

我有一个抽象 BaseEntity 类,有多个派生类,所以:

此处的 Comments 导航属性不起作用,因为每个派生(具体)类都有自己的一组 Id。在我看来,每个表中的 EntityType 列将充当某种鉴别器,但我不知道如何告诉 EF 使用它。

任何帮助将不胜感激!

0 投票
1 回答
387 浏览

c# - 实体框架 v6 中的 TPC

我正在尝试在实体框架中做一件非常简单的事情。

我有一个具有零个或多个参数的产品,这些参数将映射到它们自己的表中。但是,我无法让它工作。我一直在尝试正确映射,然后使用迁移来查看数据库应该是什么样子。我知道这在 NHibernate 中非常简单,但我被迫违背自己的意愿使用 Entity Framework v6。

背景

这些是我的实体:

我想将其存储在以下架构中:

ERD

这个怎么做?

我的尝试

每类表

我尝试使用 TPC 进行映射:

但这给出了错误The association 'ProductState_Parameters' between entity types 'ProductState' and 'ProductParameterState' is invalid. In a TPC hierarchy independent associations are only allowed on the most derived types.

不要使用继承策略

所以我试图删除MapInheritedProperties,但它想创建一个额外的、不需要的表:

我不想要这个。Parameters我可以通过删除 中的属性来摆脱这个Product,但是我无法使用Parametera 的 s Product

我要求太多还是有可能?

0 投票
1 回答
185 浏览

java - Hibernate 继承 (TABLE_PER_CLASS) 表扩展

我有两个表:UserExtended继承自User. 但我不能将现有User的提升到UserExtended.

实体:

服务:

使用此代码,我得到异常:SQLServerException: Cannot insert the value NULL into column 'email', table 'User'; column does not allow nulls. INSERT fails因为emailDB 中的列不为空。

当我取消注释该行时userExt.setEmail(user.getEmail());,我得到另一个异常SQLServerException: Cannot insert duplicate key row in object 'User' with unique index 'UQ_User_email'. The duplicate key value is (xxx@mail.com),因为email应该是唯一的。

我可以使用普通 SQL 进行插入,INSERT INTO UserExtended (id) VALUES (13);我如何使用 Hibernate 和 Spring Data JPA 来做同样的事情?