MVC EF获得多对多关系表

时间:2013-08-07 22:36:58

标签: asp.net-mvc entity-framework many-to-many

我在EF中设置了我的多对多关系。但我只能参考主表,而不是桥表。我怎样才能参考桥牌表?

例如:

User: UserID, name
Group: GroupID, group
UserGroup: UserID, GroupID

我可以通过输入

来引用User表和Group表
context.User.(some linq expression)
context.Group.(some lin1 expression)

但我不能通过输入

来引用桥接表
context.UserGroup

3 个答案:

答案 0 :(得分:1)

知道您正在使用哪些版本的MVC和EF会很棒。基于其MVC 4和EF5的假设...

Join表的目的是保持参照完整性。正如@timothy所说,没有理由引用(UserGroup)连接表,除非其中有实际的附加数据,即有效负载。如果您将其他数据放在UserGroup表中,那么它仍然不是Join表。

而是使用一些Lazy或Eager加载来获取所需的组数据:

延迟加载

var users = context.Users
foreach (User x in users)
{
  foreach (Group f in x.Groups)   

 //notice the x user being referred to here for Groups
  {
    // Whatever you want to do with the objects
  }
}

急切加载

var users = context.Users.Include(g => g.Groups)
foreach (User x in users)
{
  foreach (Group f in x.Groups)   

//notice the x user being referred to here for Groups
  {
    // Whatever you want to do with the objects
  }
}

上面的'foreach'代码刚刚添加,以显示如何将其包含在循环示例中。它是这些重要的Loading示例的第一行。

一旦定义了'var users',剩下的就是“简单”。 祝你好运!

答案 1 :(得分:0)

定义多对多关系时,您有两种选择。

  1. User链接到Group,并告知UserGroup是您的联接表
  2. UserUserGroup链接为多对一,并使用多对一链接GroupUserGroup
  3. 使用选项2的原因是,除了连接表中的两个ID之外,还有其他内容。我最近的一个例子是SortOrder字段。

    使用物化连接表进行查询时,感觉有点笨拙:

    context.User.Select(user => new {
        Name = user.Name,
        Groups = user.GroupJoins
            .OrderBy(groupJoin => groupJoin.SortOrder)
            .Select(groupJoin => groupJoin.Group.Name)
    });
    

答案 2 :(得分:0)

为什么要引用该联结表...?!

如果您想获得某个群组的用户:

var users = from u in db.UserGroups.Include("User").Include("Group")
            Where u.GroupID == gid
            select u;

如果您需要用户组,则反之亦然:

var groups = from g in db.UserGroups.Include("User").Include("Group")
                Where g.UserID == uid
                select g;