1

我在 EF 中建立了我的多对多关系。但我只能参考主表,而不是桥表。如何参考桥接表?

例如:

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

我可以通过键入来引用 User 表和 Group 表

context.User.(some linq expression)
context.Group.(some lin1 expression)

但我无法通过键入来引用桥接表

context.UserGroup
4

3 回答 3

1

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

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

而是使用一些 Lazy 或 Eager 加载来获取您需要的 Group 数据:

延迟加载

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”代码只是为了展示如何将它包含在循环示例中。这些加载示例的第一行很重要。

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

于 2013-08-07T23:23:38.030 回答
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;
于 2013-08-08T08:11:38.300 回答
0

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

  1. 链接UserGroup,并让它知道这UserGroup是您的连接表
  2. 链接UserUserGroup多对一,也链接GroupUserGroup使用多对一。

使用选项 2 的原因是当您在连接表中拥有的不仅仅是两个 ID 时。我最近的一个例子是一个 SortOrder 字段。

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

context.User.Select(user => new {
    Name = user.Name,
    Groups = user.GroupJoins
        .OrderBy(groupJoin => groupJoin.SortOrder)
        .Select(groupJoin => groupJoin.Group.Name)
});
于 2013-08-07T22:48:23.657 回答