【问题标题】:Entity Framework many to many relationship Question实体框架多对多关系问题
【发布时间】:2011-07-09 20:08:33
【问题描述】:

我有 3 张桌子:

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

我在数据库中定义了关系 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();
    }

谁能给我一个正确方法的例子吗?

谢谢,

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    耦合表“UsersInRole”(除了两个共同构成表主键的外键外没有任何其他外键)将被转换为外键“两侧”的导航属性。所以在用户和角色实体中。在用户中它将是 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")
     }
    }
    

    【讨论】:

    • 两个答案都是有效的,不幸的是我只能将一个标记为正确,如果有人有这个问题,你可以选择其中任何一个。
    • @webyacusa:谢谢! @Ladislav:很荣幸我的回答比臭名昭著的 EF 大师 Ladislav Mrinka 的回答“更受欢迎”;)
    【解决方案2】:

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

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

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

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

    【讨论】:

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