实体框架将纯连接查找表转换为多对多关系
Posted
技术标签:
【中文标题】实体框架将纯连接查找表转换为多对多关系【英文标题】:Entity Framework turns Pure Junction Look Up Tables into Many to Many relationship 【发布时间】:2013-03-29 20:30:26 【问题描述】:我最近刚刚开始在一个 ASP.NET 项目中使用实体框架(我也是最近才开始使用的,所以我最近有点不知所措)
我有一个有 4 个查找表的数据库。当我将 ADO.Net 实体添加到我的 asp.net 项目时,我起初对我的查找表消失的原因感到困惑。看了几眼,突然发现:
Entity Framework lookup table
并意识到查找没有其他列但外键成为多对多关系的表。这一切都很好。我可能在这里遗漏了一些简单的东西,恐怕可能是这种情况,但现在我迷失了如何查询我最初在遍历查找表时没有问题的数据。
这是我的数据库的通用模型(不是 EDM)
人: PID
组: GID
要求: 删除
行动: 援助
个人/组: PID GID
组/要求: GID 删除
要求/行动: RID 援助
人物/动作: PID 援助
现在有了 Person、Group、Requirement 和 Action 之间的多对多关系 我不确定如何在我的 ASP.Net Web 表单项目代码中构造语句来遍历我以前使用查找表的关系。
我曾经能够查询 PID = "desired person's id" 的 Person/Group,然后使用 GID 从 Group/Requirement 中查找所有 RID。然后使用 RID 从 Requirement/Action 中查找所有 AID。然后将这些 AID 与 AID 匹配的 Person/Action 中的所有 AID 进行比较,以检查是否满足要求。
如果你告诉我这是我忽略的 ASP.NET 中的基本内容,我不会受到侮辱,但我想如果我在这里问并且得到了回答,那么对于从 SQL 转换的任何人来说,至少会有一个简明的答案对实体框架的查询。
【问题讨论】:
【参考方案1】:在 EntityFramework 中,您可以选择添加所谓的“导航属性”。例如,让我们从假设的 Person 类中查看这些代码 sn-ps。
1 : 1 或 1 : 从 1 的角度来看很多
public class Person
public virtual Group Group get;set;
Many : Many or 1 : Many 从 Many 的角度来看
public class Person
public virtual ICollection<Group> Groups get;set;
在多对多关系的情况下,您将使用 EntityFramework FluentAPI 来设置您的 Person 和 Group 类之间的关系。对于 1 对 1 或 1 对多,您可以使用 FluentAPI、DataAnnotations 或让 EntityFramework 猜测(我相信它会猜测 PropertyName_ID)。
属性声明中的virtual
意味着我允许 EntityFramework 在我实际使用它时延迟加载集合,而不是在我查询上下文时。你可以声明一个没有 virtual 关键字的导航属性,但是你不能延迟加载它。
希望这可以帮助您了解导航您的实体。我将一些术语加粗,我认为您应该在 Google 上搜索以帮助进一步了解 EntityFramework 的运作方式。
从您获取给定人员的组所需的所有操作的问题:
var requiredActions = myPerson.Groups.SelectMany(x => x.Requirements).SelectMany(x => x.Actions);
一个人执行的动作是:
var performedActions = myPerson.Actions;
这两行都假设您已经设置了适当的导航属性。
【讨论】:
我认为OP首先是关于数据库的。【参考方案2】:每当您获得一个 Person 对象时,您将拥有 Actions 和 Groups 的属性。
组也应该具有 Requirement 属性。
所以我认为你正在寻找的是类似的东西
list<int> personIds = 1,2,3;
List<Requirement> requirements = dbContext.Groups.Where(x => x.Person.Count(y => personIds.Contains(y.PersonId) > 0).Select(x => x.Requirements);
List<Action> actions = requirements.Actions;
你也许可以用一种更巧妙的方式来完成这项工作,当我在 EF 工作时,多对多关系总是有点痛苦。
【讨论】:
以上是关于实体框架将纯连接查找表转换为多对多关系的主要内容,如果未能解决你的问题,请参考以下文章