实体框架将纯连接查找表转换为多对多关系

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 工作时,多对多关系总是有点痛苦。

【讨论】:

以上是关于实体框架将纯连接查找表转换为多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在不破坏范式的情况下为多对多关系构建连接表

代码第一个约定不在实体框架6.2中的多对多关系上创建连接表

mybatis11--多对多关联查询

将表拆分为多对多关系:数据迁移

使用实体框架中的导航属性填充多对多关系表

实体框架6:多对多关系问题[关闭]