问题标签 [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 投票
2 回答
656 浏览

c# - asp.net中的父子层次结构

在此处输入图像描述

我想在 asp.net 中显示家庭层次结构。

我有作为 Family 的表,其属性为 ParentID、ChildID、Name。表在 ParentID 和 ChildID 上有 seft 连接。我如何显示数据库中的数据。层次结构级别不固定。

#已编辑

我希望aspx 部分显示此层次结构树,即我将如何使用repeater 或其他任何控件在aspx 中显示此树。

0 投票
1 回答
2954 浏览

c# - Entity Framework Code First - 根据子 TPH 类的类型进行选择

我目前正在使用 Entity Framework 4 处理一个项目,该项目使用 Table Per Hierarchy 来表示使用单个表的一组类。其工作方式是该表表示状态,并且不同的状态与不同的其他类相关联。

所以你可能会想象它看起来像这样,忽略所有州共享的公共字段:

每个状态都有属于它的所有 InventoryItems 的集合。

现在我的库存中的每个项目都有许多状态,历史中的最后一个是当前状态。为了保存在列表中,我有一个快捷方式字段指向我的库存当前状态:

我遇到的第一个问题是,例如,当我想查找所有处于该Active状态的 InventoryItems 时。

事实证明Linq-To-Entities 不支持 GetType()所以我不能使用像InventoryRepository.Get().Where( x => x.LastState.GetType() == someType ). 我可以使用is运算符,但这需要一个固定的类型,所以不能有这样的方法:

在进行 Linq 查询之前,我必须根据类型运行某种 if 语句,这感觉不对。InventoryItem 列表可能会变大,因此我需要在 EF 级别执行此操作,例如,我无法将整个列表拉入内存并使用 GetType()。

在这种情况下,我有两个问题,它们之间的联系足够紧密,我认为它们可以结合起来,因为它们可能反映了我缺乏理解:

  • 是否可以使用 Linq To Entities 找到共享子表类型的项目列表?
  • 鉴于我没有使用延迟加载,是否可以Include使用 TPH 为子表类型关联项目,例如,如果我有一个 InactiveState 作为我的 InventoryItem 的子项,我可以为该 InactiveState 预加载 StateStore?
0 投票
1 回答
1134 浏览

c# - 实体框架代码优先TPH继承-不同的子类可以共享一个字段吗?

我有一个使用 Entity Framework Code First 创建的实体框架模型,它使用 Table Per Hierarchy 继承,其中结构看起来有点像这样:

现在,创建的内容在我BaseStates拥有Owner_IdOwner_Id1存储的表中。但是鉴于没有一个类会同时是 aCreatedState和 anUpdatedState似乎Owner_Id对两者都使用一个是合乎逻辑的。这也将使跟踪数据库变得更容易。

我的基本问题是:Code First EF4 可以做到这一点吗?

我试图映射列:

那似乎没有任何效果。

然后我尝试创建一个共享父类,无论如何这可能是更正确的OO:

再次,没有骰子。或者,更令人担忧的是,这似乎在某些情况下有效,而在其他情况下则无效(显然我的实际配置稍微复杂一些),而我可以准确地看到它工作的类之间没有区别。

编辑以获取有关失败的更多详细信息:我有两个字段的行为方式与我上面描述的方式相同,我们可能会调用关联的类OwnedStateActivityState,我已按照上一个示例中所示的方式将它们创建为抽象类。OwnedState有两个派生自它的类,ActivityState有三个。在我的数据库中,ActivityState_Id还有.OwnedState_IdOwnedState_Id1

除了它们引用的类型(其他实体)之外,我看不出OwnedStateActivityState类之间没有任何区别,但在数据库中,似乎 EF 以某种方式对它们进行了不同的解释——我不太了解 EF 内部结构知道它是如何做出这个决定的。

0 投票
0 回答
573 浏览

c# - 实体框架:Table Per Hierarchy 是适合这种情况的正确继承模式吗?

想象一下,我有一个要存储在 Entity Framework 4.1 数据存储中的对象层次结构。我正在使用 Code First 创建它们。它们看起来像这样:

BasicState是所有其他状态的父级,其他所有状态共享这两个字段/关系。

我最初的想法以及我实现这一点的方式是使用 Table Per Hierarchy 继承,因为我似乎可以从BasicState这些公共属性继承并让我的其他状态参与其中。

然而,这导致了一个问题,因为当不同的状态共享一个字段时,底层数据模型不会,例如,我的数据库将来自EntityLocation_Id一个ReceivedState和另一个。这使得创建测试数据变得困难,因为您不知道哪些字段属于哪些模型。我之前问过这个问题。ApprovedStateEntityLocation_Id1

我寻求的解决方案是这样的:

这部分工作,但是尽管它创建了一个,但EntityLocation_Id它仍然Order_IdsOrderedStateand创建了两个DispatchedState,即使它们的行为方式相同并且实现无法区分。

几乎解决了一半,我现在遇到了另一个问题,这导致我问这个问题:

鉴于我 和 之间的关系BasicStateStatefulEntities两个方向上是多对多的,我需要能够OrderedStates从属于 a中找到订单详细信息StatefulEntity

问题是,虽然这在 SQL 中很容易表示,但所涉及的继承意味着 Entity Framework 不知道任何给定是否BasicState为 an OrderedState,因此似乎无法单次访问数据库以包含OrderedState.Order.

所以我不能做的是这样的:

显然,这不是可以运行的代码,但它显示了问题所在 - Order 仅属于的某些子类型,BasicState因此 EF 不会预加载它,即使我正在使用某种类型的演员表。

如果我尝试投影,我会得到这样的结果:

但是,我需要找到从投影返回的匿名类型返回到我的 StatefulEntity 的方法,以便我的其余代码能够处理它,这感觉像是一个重要的长切。

我已经尝试这样定义我的基类和继承者:

依此类推,但我似乎打破了首先拥有 TPH 的基本点,我觉得我还不如在通用数据类上滚动我自己的对象模型。

编辑:我想我现在对此有了更多的了解-从尝试将 ForeignKey 设置在该关系的远端(即 Location 和 LocationState 之间的关系),它看起来好像 Order 或 Location 上的反向集合可以'不要与不在基础对象上的属性交谈,所以我必须使用上面的版本。这在我如何管理没有 EntityLocationId 或 OrderId 的案例时产生了一个新问题——如果我将这些字段设为可为空,则会引发一个错误,即在数据库创建期间引用字段不能为空,并且默认情况下无法在代码优先中的字段。

任何人都可以推荐一种更好的方法来表示可以与实体框架一起使用的这种类型的模型吗?

0 投票
0 回答
1020 浏览

c# - 实体框架 4:看似简单的查询出现动态代理错误?

我在我的 POCO 实体框架应用程序中进行了 Linq To Entities 查询,如下所示:

OfType是因为 State 实体使用 Table Per Hierarchy 继承。只有OrderedState及其子级拥有Order可供他们使用的财产。

但是,当我运行它时,我遇到了以下错误:

无法从包含 My.NameSpace.Entities.OrderedState' 类型对象的 EntityCollection 添加、附加或删除类型为“System.Data.Entity.DynamicProxies.OrderedState_6F372135E57CB68DDA1A42541A941E1F0848887EABD8BD4833D0159C9D8B055F”的对象。”

OrderedState这是因为 EntityFramework 对继承并共享公共属性的事实感到困惑OrderState,这是我感兴趣的?如果我.Include(x => x.Order)从 Linq 语句中删除,则可以避免错误,但是当我的全部目的是准确检索该值时,与此 State 相关的 Order 本身返回为 null。

编辑:随着更多的研究,我意识到一些更奇怪的事情正在发生。我的 TPH 继承层次结构是这样的:

因此,当我寻找它时,OrderedState它可能是 OrderedState 或 A DispatchedState,但我感兴趣的是加载Order属性,如果我有一个未类型化的 BaseState 对象列表,我将无法执行此操作。

我现在意识到的是,当我拥有.Include( x => x.Order) 实体框架时会忽略类型参数。当我调整我的种子数据并开始收到这种类型的错误消息时,这变得更加清晰:

无法从包含 My.NameSpace.Entities.OrderedState' 类型对象的 EntityCollection 添加、附加或删除类型为“System.Data.Entity.DynamicProxies.ReceivedState_6F372135E57CB68DDA1A42541A941E1F0848887EABD8BD4833D0159C9D8B055F”的对象。”

我对此感到惊讶,所以我想我会尝试加强类型:

果然,当我不尝试包含该Order属性时,我只得到 OrderedStates 回来。一旦我使用Include我就会得到一个异常,因为我故意试图避免返回的类型无法返回。我正在查询的 Id 绝对是 OrderedState 的 ID——事实上,我调用的方法只接受 OrderedState 对象作为测试,看看这是否会阻止这个问题。

我的目标是从 TPH 表中检索单个类型化元素,包括只有该类型化元素才有的子属性。

0 投票
1 回答
344 浏览

entity-framework - 告诉实体框架为此外键使用正确的名称

编辑:我可能应该包括电子邮件、地址和电话实体:




我有以下表格:







这是我的 dbcontext 的设置: public class MyRepository : DbContext { public MyRepository() : this("PatientFirst") {}


在我的担保人控制器中,如果我只是对 dbset 进行正常查询,而不包括 Email 属性,我会得到我期望的返回 xml,但是当我在查询中包含 email 属性时,它会给我一个 sql 错误:

这是我得到的错误(减去只是告诉我 SQL 抛出错误的堆栈跟踪):

在包含电子邮件的情况下,出于某种原因试图调用 FK 列“Person_PersonId”,为什么它会使用它而不是仅使用“PersonId”,因为它在电子邮件对象上被调用。如何让它为 FK 使用“PersonId”而不是“Person_PersonId”?

0 投票
0 回答
251 浏览

c# - C# Table Per Hierarchy Projection Union

我正在使用每个层次结构的表来投影到模型类。当我在 Linq to Entities 中使用 type 时,我的所有结果总是最后一个投影的类型。我的意思是,如果我有这些用于域模型:

我有一个带有名称和类型列的 Person 表,并使用每个层次结构的表来生成特定的实体(我将其称为 EmployeeEntity 和 ManagerEntity)。

当我使用此代码时:

在projectedPeople 中的所有对象类型都是Employee,甚至那些应该是Manager 类型的对象。如果我删除 Concat 调用并单独运行它们,我会得到正确的类型(经理或员工)。

我在这里做错了什么?我编写了一些测试代码,通过制作对象的虚拟列表并在它们上调用 AsQueryable,然后进行投影,从而从等式中删除了 Linq,并且它应该正常工作。

0 投票
0 回答
158 浏览

entity-framework - 实体框架:TPC 层次结构中的一对一问题

我有一个像这样的 TPC 层次结构:

然后我运行代码并 EF 创建表(Sub1s 和 Sub2s)。但是EF为表Sub1创建了一个额外的外键,它不使用Sub1的键作为外键..它生成一个名为Vender_BaseId的额外FK..

0 投票
1 回答
218 浏览

ef-code-first - 正在生成 EF5 TPH 额外外键 - 如何摆脱它们?

这是我编写的示例应用程序,它产生的行为与我实际的更复杂的应用程序相同。我显然在某处遗漏了一些配置方面,但我一生都无法弄清楚。出于某种原因,我的 KID 类中的每个集合都在 Sweet 表中接收自己的字段和外键......据我所知,这不是必需的......?如何停止 EF 生成这些?

示例类、配置和生成的迁移代码如下(注意,如果我使用 TPT 而不是 TPH,则不会添加额外的字段,并且 OwnerId 被用作关系字段就好了)

我的课程:

我的配置(从 OnModelCreating 调用)

生成的迁移代码:

更新:

由于不支持我当前的模型,我已经像这样更改了我的 Kid 类:

0 投票
1 回答
1114 浏览

entity-framework - 实体框架继承将外键移动到 TPH 中的子项

我在我的实体模型中使用每个层次结构继承的表,并且我有一个父表,其中包含通过外键与其他表的关系。

我的父表(产品)与另一个在 EF 中解析为导航属性的表有 FK 关系。我可以轻松地将该导航属性移动到我的子表(Fragrance)并将其从父表中删除,这很棒。但是,我也想将外键属性 (FragranceId) 移动到子级,但我不知道如何执行此操作,因为 FK 关系要求我的父表具有该属性。

下图说明了我已经走了多远,基本上我要做的就是将 FragranceId 移动到 Perfume 实体中。

图表

看起来这应该是可能的,但由于 Perfume 不是一个表,它不能处理数据库关系,虽然 Fragrance 和 Property 之间存在这种关系,但我不能从 Product 中删除 FragranceId。

移动 FragranceId 会导致 EF 错误“在 Role Product 引用的类型中没有定义名称为 FragranceId 的属性。

Fragrance 和 Perfume 之间的关系是 1 比 1。

任何帮助都是极好的。谢谢。