我在EF中设置了我的多对多关系。但我只能参考主表,而不是桥表。我怎样才能参考桥牌表?
例如:
User: UserID, name
Group: GroupID, group
UserGroup: UserID, GroupID
我可以通过输入
来引用User表和Group表context.User.(some linq expression)
context.Group.(some lin1 expression)
但我不能通过输入
来引用桥接表context.UserGroup
答案 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)
定义多对多关系时,您有两种选择。
User
链接到Group
,并告知UserGroup
是您的联接表User
与UserGroup
链接为多对一,并使用多对一链接Group
与UserGroup
。使用选项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;