【问题标题】: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 转换的任何人来说,至少会有一个简明的答案对实体框架的查询。

【问题讨论】:

    标签: asp.net .net sql entity-framework orm


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2011-12-17
      相关资源
      最近更新 更多