实体框架多对多关系问题

时间:2011-07-09 20:08:34

标签: c# entity-framework

我有3张桌子:

-Users (UserId(pk), Email, Password)
-Roles (RoleId(pk), RoleDescription)
-UsersInRole (UserId(pk), RoleId(pk))

我在DB中定义了Users-> UsersInRole和Roles-> UsersInRole之间的关系。当我在Visual Studio中创建edmx文件时,它只显示两个类:用户和角色通过多对多关系连接(UsersInRole表未显示为我猜的类,因为该表可以将多个表分解为许多数据库问题)。

现在,我正在尝试定义一个给出角色的方法,它应该返回一个用户列表。这不起作用:

public List<User> usersPerRole(string role)
    {
        return from u in entities.Roles where u.RoleID == role select u.Users.ToList();
    }

那里的任何人都可以给我一个正确方法的例子吗?

谢谢,

2 个答案:

答案 0 :(得分:1)

你需要这样的东西(我希望你在Users实体上有Role导航属性):

public List<User> UsersPerRole(string role)
{
     return entities.Roles
                    .Where(r => r.RoleId == role)
                    .SelectMany(r => r.Users)
                    .ToList();
}

你可以在没有lambdas的情况下重写它:

public List<User> UsersPerRole(string role)
{
     return (from r in entities.Roles
             from u in r.Users
             where r.RoleId == role
             select u).ToList();
}

答案 1 :(得分:1)

耦合表“UsersInRole”(除了一起构成表的主键的两个外键之外)将被转换为foreighn键“两侧”的导航属性。所以在用户和角色实体中。在用户中,它将是User.RolesForThisUser,在角色中它将是Role.UsersWithThisRole。在耦合表中添加任何互补列将导致该表的特定实体,并且如所解释的那样丢失导航属性。

现在你的问题可以简单地做:

public List<User> usersPerRole(string role)
{
 using(Entities context is new Entities())
 {
  return context.Role.FirstOrDefault<Role>(r => r.ID == role).Include("UsersInRole")
 }
}