问题标签 [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.
c# - 如何在 Table-Per-Hierarchy 中找出实体类类型的表名?
我发现下面的代码使用方法找出给定实体类类型的实体的表名GetTableName
。但是GetEntitySet
方法失败了,因为在 TPH 中的表名,因此看起来 EntitySetBase 与子类型不同。"Entity type not found in GetTableName"
它从第throw
15 行的语句中抛出带有 message 的异常。
如果我有一个基类A
和一个派生类B
,如何找出 B 类型对应的 EntitySetBase 对象?(它应该给我与 A 相关的 EntitySetBase,以便我可以找出表中的记录[dbo].[As]
。)
c# - Entity Framework 6.1 Code First TPH/TPT 混合映射问题
我有一个模型,其中大多数实体都继承了相同的基本功能。该功能被封装在一个抽象基类中。除此之外,还有两个功能分支,因此有两个抽象类继承自抽象基类。此时,具体类继承自它们各自的中间抽象类。
下面是此类模型模型的一个分支的类和 EF 映射示例:
我遇到问题的地方是表映射。虽然 mapping Intermediate
、Concrete1
和Concrete2
确实生成了一个数据库——甚至给了我一个鉴别器列——它并没有像 TPH 映射所要求的那样使列可以为空,因此我最终得到以下异常消息:
(28,10):错误 3023:从第 28 行开始映射片段时出现问题:必须映射表 Concretes 中的列 Concretes.Concrete1Integer:它没有默认值且不可为空。
我已经尝试了几种排列方式-
- 仅映射
Intermediate
到自定义表格,但具体类型的字段映射到“基础”表格。 - 映射
Intermediate
到自己的表和Concrete1
&Concrete2
到名为“Concretes”的表 - 与上面代码示例中的原始映射完全相同的问题。 - 将每个实体映射到它自己的表 - 这行得通,但它纯粹是 TPT,这不是我想要的。
- 什么都不映射——这会将所有内容都放在“Bases”表中,并且纯粹是 TPH,这实际上会导致表的宽度和稀疏度令人无法接受。
是否没有某种方法可以获取我在代码示例中寻找的映射?也就是使用鉴别器的“Bases”表和“Concretes”表?
entity-framework - 在 ERD 和 EF 中建模这种关系的正确方法是什么?
我正在为一个新系统设计一个全新的数据库模型。我的目标是将它存储在 SQL 中并通过实体框架映射到对象中。我大量使用 Table-per-Hierarchy 模式来支持复杂的对象层次结构,并让它被数据库引擎“正确”地强制执行。
我有以下情况,我不知道如何处理:
我有一组称为资源的实体。每个资源都是一种特定类型,并包含许多特定属性。
- 资源(抽象类,映射到资源表)
- 资源表有一个鉴别器列和一个 ResourceId 作为主键
- 类,例如:ServerResource(具体类,从 Resource 继承,映射到 1-1 到 Resource 的 UrlResources 表......总体而言,还有大约十几种其他资源类型(数量正在增长)
- 每种类型的资源都有一组特定于该资源的独特属性)
我还有许多名为 Checks 的实体。每个资源都包含许多检查。ResourceId 是 Checks 表中的外键。检查稍微有趣一些。有一些或所有类型的资源共有的 Check 类型。还有一些 Check 类型非常特定于某些类型的资源。更准确地说:
- Check(抽象类,映射到Checks表,CheckId为主键)
- OutageCheck(大多数类型的资源都支持)
- SslCertExpirationCheck(仅受 1 种资源支持)
- 等等。每种资源类型大约有 3-4 种检查类型。其中 1-2 个是在大多数资源之间共享的,而其余的则是特定资源的自定义
所以,我的问题是关于如何在 ERD 和实体框架中映射检查。最直接的方法是创建几十个表,每个表都有特定的资源类型和检查类型组合。IE:ServerOutageCheck、StorageOutageCheck、UrlOutageCheck、UrlSslExpiraitonCheck、ServerLowMemoryCheck等。
这似乎有点难以管理和维护。我希望能够在单个表中共享通用检查,特定于该通用检查(即:OutageCheck),并且仅偏离特定于资源的检查(即:SslExpirationCheck)。这可能吗?或者从表管理的角度来看,我能做的最好的事情是 O^2 吗?
最后的想法。我的数据库非常频繁地读取和非常不频繁地写入。如有必要,我还可以缓存读取的内容。
hibernate - 如何使 tablePerHierarchy 为假并使用鉴别器?
这里提出了我需要的问题,但它的答案不能满足我的需要。我有这样的课程:
我想为每个类创建一个表,所以我添加了 tablePerHierarchy 并将其设置为 false,如下所示:
但是当我运行程序并创建一个数据库时,没有鉴别器,我想查询表 A 并找出它是 B 还是 C?我怎样才能在这个策略中添加鉴别器?
asp.net-mvc - 我应该如何将每个层次结构实体的表实现到视图中
我已经在我的一个实体中实现了 table-per-hierarchy 模式,它看起来像这样:
atm、sube 和 acikhava 实体基本上是从 mekan 实体派生的。这些没有问题。好吧,我想知道的是,我应该如何将其实现到 CRUD 视图中。
所有这些实体都有自己的视图模型,而 mekan 本身并不是要自己创建的,用户只能创建 atm、sube 或 acikhava,因为 mekan 是一个抽象实体。但我不能只将视图模型设置为基本实体并继续,因为它不应该以这种方式使用,并且会引发错误。
现在,我是否应该将此派生实体视为完全不同的实体,并为每个不同的操作创建它们的单独视图?或找到另一种方法来实现这一目标。
谢谢。
entity-framework - Entity Framework 6 Table per Hierarchy (TPH) 错误
我创建了一个具有一些基本属性的抽象类:
我的物品类别:
我的 OnModelCreating 方法:
当我保存数据时,它会生成下一个 sql:
我不知道它为什么会生成 ShortDescription1 和 ShortDescription1
entity-framework - 来自 Backupfile 的 EF6 代码优先鉴别器
我有一个未使用过 EF 的旧数据库的备份文件。现在我使用 EF 代码创建一个新的数据库,首先使用流利的 api,每个层次都有一个表。这就是为什么我有一个不可为空的鉴别器列。在我的备份文件中没有鉴别器。因此,当我尝试恢复旧的备份文件时,由于尝试将 NULL 值插入鉴别器列而引发异常。
将 NULL 插入鉴别器列时是否可以设置默认值(在 EF 的帮助下)?
编辑:恢复是在数据集的帮助下完成的。我可以将值添加到数据集中,但我不想那样做。
c# - 实体框架 Fluent API 不考虑基类属性
英孚 6.1:
我们刚刚开始了一个有很多 pf 继承的项目。选定的继承数据库映射类型是每个层次结构的表。问题是,当尝试使用 add-migration 生成迁移时,会引发以下错误:
以下是使用的类和配置类:
我知道我们可以使用 [ForeignKey] 属性来告诉派生类的导航属性应该使用父抽象类中定义的列。我们希望避免使用 DataAnnotations。我只是不明白为什么它会抛出这个错误。“版本”导航属性是在 AbstractR 配置中定义的,而不是在 SER 配置中定义的(由于 SER 继承自 AbstractR,这也应该有效),对吗?
其次,在删除 Version 属性和映射时,SER 映射中使用的“ChildId”和“ParentId”属性也会出现同样的问题。这是一个已知问题吗?难道我做错了什么 ?
PS:为简单起见,已删除 ParentId 映射,因为它似乎与 ChildId 映射存在相同的问题。
有谁知道为什么会发生这种问题?
更新
经过更多研究,Fluent API 似乎无法使用基类属性进行映射。那正确吗 ?这是一种通缉行为吗?为什么 DataAnnotations 能够使用基类属性而不是 Fluent API?不是所有的基类属性都插入到每个类中,还是使用某种装饰器模式读取?
grails - 初始化使用 grails 鉴别器配置的子类对象
我有一个父类:
因此,如上所示,类 Child1 和 Child2 扩展了类 A,鉴别器列将用于区分实例。
数据库表如下:
现在我有另一个类 ContainerClass 如下:
现在,当我创建一个 ContainerClass 对象并且在数据库中还有需要获取的数据时,LazyList.decorate 函数无法初始化子对象列表。我得到一个例外如下:
有什么不同的方式可以让这些带有grails鉴别器参数的子类和父类中的整个表映射?
c# - 具有共享列和非共享列的每个层次结构表映射
这是这个问题的扩展,据我所知,它现在在 EF6 中有效。但是,当您拥有同时具有共享和非共享属性的子类时,似乎存在问题。
假设这是我的模型设置:
在数据库中,我想BirthCertificate.RegistrationNumber
和Licence.LicenceNumber
共享同一列,Number
. 因此,我正在像这样设置我的模型:
当我生成数据库时,它看起来和工作正常:
现在讨论手头的问题。假设Licence
实体还需要记录到期日;所以我添加如下:
现在,当我重新生成数据库时,它看起来像这样:
更重要的是,如果我尝试插入许可证和出生证明,我会得到以下异常:
EntityFramework.dll 中出现“System.Data.Entity.Infrastructure.DbUpdateException”类型的未处理异常
附加信息:跨实体或关联共享的值在多个位置生成。检查映射是否不会将 EntityKey 拆分为多个存储生成的列。
我可以理解为什么会引发该异常-因为数据库没用。
我错过了什么?