问题标签 [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# - Entity Framework 6.1.1 忽略 ProxyCreationEnabled 设置
我有一个上下文类,在某些时候我需要从我的 POCO 类中的数据库中获取数据,以便我可以序列化该数据并发送到我的 Web 服务。我不想反序列化另一端的代理,但我无法强制 EF 创建我的 POCO 类。
我正在使用以下代码来检索数据:
请注意,TreeNodes 是 TPH,而基类是抽象的。在我的情况下,有没有办法获得 POCO 课程?
c# - 每个层次结构的表不是 EF6 的默认行为
我正在尝试将这三个类映射到一个 EF 表。在这种情况下,我的基类实际上有一个基 Entity 类,这会导致我的问题吗?我没有找到任何涵盖默认行为未正确处理的场景的示例。
基类:
子班:
实体基类:
nhibernate - nHibernate - 有没有办法调试 TPH 对象的创建?
我有一个由代码映射的按层次结构的表结构,以及一个包含数据的表 - 116 行。最初,该表(和整个数据库)是使用 Entity Framework Code First 方法创建的。由于某些原因,我从 EF 切换到 NH,并尝试从提到的表中获取数据导致 115 个正确创建的对象,并且只有一行导致代理对象的基类型错误。我试图找出其他相似行和错误行之间的差异(有 30 行具有相同的鉴别器值),但我失败了。因此,问题是 - 我可以使用什么调试技术来解决我的问题?
下面是我如何从表中加载数据的小片段:
这是一个映射:
c# - Table-per-hierarchy 和复合主键
我在旧数据库中有两个表(我无法修改),数据如下:
Table1 有一个复合主键(Code、Abbrev),但 Abbrev 也用作鉴别器(见下文)。Table2 有两个外键列(CodeA、CodeB),它们都引用 Table1 中的相同字段 Code。Table1.Code 字段中有重复项。
我想在 Entity framework 6 中使用 table-per-hierarchy 方法。因此,我创建了以下模型类:
我在 DataContext : DbContext 类中定义了 table-per-hierarchy ,如下所示:
问题是当我想使用这种映射时 - 我不能使用鉴别器字段(Table1.Abbrev)作为 MyBaseClass 中复合键的一部分 - 我收到以下错误:
EntitySet 'DataContext.MyBaseClass' 中的所有对象都必须具有唯一的主键。但是,“MyBaseClassA”类型的实例和“MyBaseClassB”类型的实例都具有相同的主键值,“EntitySet=MyBaseClass;Code=1”。
是否可以将上面的模型与实体框架 6(或更高版本)映射?
entity-framework - EntityFramework Table Per Hierarchy 查询多个鉴别器
这是场景 -
我们有一个支持发布到多个社交网站(Facebook、Twitter、G+ 等)的应用程序。
我们使用 TPH 将其构建在一个Posts
表中,并带有一个鉴别器列。这些“社交”帖子中的每一个都派生自一个公共基类,适当地称为SocialPost
.
我们只是说它会用,和context.SocialPosts
的鉴别器抓取所有内容。FacebookPost
TwitterPost
GooglePost
现在我们需要能够获取类型的混合搭配。基于一个设置,我们希望撤回所有,例如 Facebook 和 Google Posts 以进行处理,同时保持 Twitter 不变。
有没有一种理智的方法可以在一个查询中做到这一点?
以下代码
将产生如下 SQL
这显然不是我想要的。我不确定在鉴别器上使用双重过滤器本身是否重要,但使用它绝对是奇怪的 SQL。
那么,有没有一种理智的方法可以通过一个查询来获取多个鉴别器类型,或者最好是全部获取SocialPosts
然后在应用程序端过滤掉我不想要的那些。
c# - 在 dapper 中查询抽象模型
我正在使用 Table Per Hierarchy 数据库继承,其中所有派生类型的列都在一个表中。每个派生表都使用包含派生类名称的字符串鉴别器字段进行标识:
正如预期的那样,当通过 Dapper 的查询方法检索它时,我收到Instances of abstract classes cannot be created
. 我希望这将返回一个 Animal 列表,它们的值是各自的派生类型。
我尝试添加对此的支持没有成功。如果传入的类型是抽象类,则在调用 SqlMapper.cs::GetTypeDeserializer() 之前,我将类型替换为以下方法中返回的类型:
但是,此时阅读器似乎尚未打开,因此失败并显示Invalid attempt to read when no data is present
.
这是正确的方法吗?是否有任何努力在其他地方支持这一点?
c# - Entity Framework Code First TPH 鉴别器列
我正在使用具有 Code First 和 Table per Hierarchy (TPH) 继承的 Entity Framework 6.0。
请参阅以下 MWE(我省略了其他 fluent api 语句以澄清问题所在):
我想将所有具有1
for 列Type
(应该是鉴别器列)的条目映射到 class CEO
。1
与列的条目不同的所有条目Type
都应映射到类Other
。
这里出现了两个问题。第一个是如何编写.HasValue(**<>1**));
正确的代码。第二件事是我想Type
在我的代码中使用该列,但由于这是鉴别器列,我无权访问它。
c# - 实体框架多级继承与 TPH
我正在使用一个为一定数量的项目实现 TPH 的遗留系统。所以当前的结构看起来像这样
因此,类型 (T*) 是所有表的鉴别器,但由于某些类型共享公共列,因此存在大量不同的表。问题是所有这些项目实际上都有一个小的共同点,但是没有办法将所有这些项目收集到一个集合中。实际上,层次结构实际上应该看起来更像这样。
所以本质上我们拥有的是一个 TPT,其中每个类型的每个表都是一个 TPH。对于一个真实世界的例子,这就是我们需要的。
显然,最初的设计存在一些设计缺陷,没有人预计需要在不查询 3 个不同的表的情况下获取所有车辆的列表。所以我的问题是,现有的结构有没有办法将这个新的层次结构添加到实体框架中。我在想这样的事情
这可能吗?有没有办法在实体框架中映射这些?我似乎无法正确匹配它们。如果我们用 VehicleId 替换 BoatId、PlaneId 和 CarId (如实体框架中的条件映射 - 或使用 TPH 的操作) ,似乎它可能会起作用,但那时我们将进行真正侵入性的模式更改,这并不是真正的选项,我不确定这是否可行。本质上,我需要一种将现有键映射到新层次结构的方法。任何帮助是极大的赞赏。我很茫然,似乎找不到任何可以回答我问题的解决方案。
entity-framework - Entity Framework Table Per Hierarchy Inserting Multiple Id Columns
I have seriously spent two work days trying to a TPH setup from Database First to Code first. The Error I get is Something like "Invalid Column Name Entity_EntityId/ Entity_Entity_Id1"
I've drawn up a very basic reproduction of the issue like so:
Context:
Mapping:
Entities:
How can I get the table to just have a single "AnotherClassId?"
c# - 每个层次结构的实体框架表不创建鉴别器
经过几次迁移,我创建了一个继承层次结构。现在,当我使用代码优先迁移更新数据库时,代码优先不会自动创建鉴别器字段。此后,我删除了该表并重新创建了它(使用代码优先迁移),但没有任何运气。我唯一能想到的是派生类中没有额外的“非虚拟”属性——创建继承结构是为了强制执行一个业务规则,即只有某个派生类型才能与另一个实体有关系。
基础类型:
派生类(没有不同/唯一的标量属性):
另一种派生类型
代码优先是否没有在数据库中添加鉴别器列,因为它看不到派生类之间的任何差异(因为没有任何唯一的“非虚拟”属性)?如果是这样,我该如何解决这个问题?如果不是,代码优先不会在数据库中自动创建鉴别器列的一些原因是什么?我有另一个 TPH 结构,它完全按照它应该的方式工作。
数据库上下文:
我还尝试创建每个派生类型独有的“虚拟”属性。代码迁移将新属性作为列添加到表中,但迁移没有创建鉴别器列。