【问题标题】:Filter users by roles按角色过滤用户
【发布时间】:2013-01-27 07:30:47
【问题描述】:

我有一个带有标准帐户控制器的常规 MVC 应用程序。我在 UserProfile 类中添加了几个字段,所以现在看起来像这样:

 public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
        public string FullName { get { return FirstName + " " + LastName; } }
        public int GroupId { get; set; }
        [ForeignKey("GroupId")]
        public ICollection<Group> Groups { get; set; }
        }   

所以,基本上说用户可以分配到多个组。 (同样在 Group 类中,我说 Group 可以包含多个用户,显然)。

现在,每个用户都必须具有特定的角色。 (管理员、教师、学生等)

我按照这样的在线教程添加了角色支持:

<roleManager enabled="true" defaultProvider="SimpleRoleProvider">
      <providers>
        <clear/>
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
      </providers>
    </roleManager>
    <membership defaultProvider="SimpleMembershipProvider">
      <providers>
        <clear/>
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
      </providers>
    </membership>   

现在我想按 RoleName 过滤所有用户。但我没有办法做到这一点。
IE。像这样的东西。 Users.Where(x=&gt;x.RoleName=="Admin").Select(x=&gt;x.FullName)
UsersICollection&lt;Users&gt; 类型的 Group 类的属性)。我如何在没有角色类的情况下获得角色?

【问题讨论】:

  • 啊,我明白了,您可以将表 pages_Roles 映射到您的 EF 模型中,方法是在您的上下文中使用 RoleName 列将其添加为 DBSet,然后在 roleMembership 表和用户表之间连接用户名让所有人都担任特定角色。
  • @LukeMcGregor,实际上是通过 pages_UserRoles 建立的多对多关系。我以为有更好的方法。您有如何实现这一目标的示例吗?
  • 我通常根本不使用角色提供者并创建自己的数据库表

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5


【解决方案1】:

asp.net 成员有一个带有 GetUsersInRole 方法的静态 Roles 类,HttpContext 中的 CurrentUser 也可以告诉你活动用户所在的角色。

http://msdn.microsoft.com/en-us/library/system.web.security.roles.getusersinrole.aspx

http://msdn.microsoft.com/en-us/library/system.web.security.membershipuser.aspx

【讨论】:

    【解决方案2】:

    这是一个基于 Luke 建议的示例。

    您的 UsersContext 类构造函数应如下所示:

     public class UsersContext : DbContext
        {
            public UsersContext()
                : base("DefaultConnection")
            {
            }
    
            public DbSet<UserProfile> UserProfiles { get; set; }
            public DbSet<RoleModel> Roles { get; set; }
            public DbSet<UsersInRole> UsersInRoles { get; set; }
        }
    

    请注意,我添加了两个额外的 DbSet。这些已经在会员数据库中,这只是我们映射它们的方式。

    “RoleModel”和“UsersInRole”模型声明如下:

     [Table("webpages_Roles")]
    public class RoleModel
    {
        [Key]
        public int RoleId { get; set; }
        public string RoleName { get; set; }
    }
    
    [Table("webpages_UsersInRoles")]
    public class UsersInRole
    {
        [Key, Column(Order=0)]
        public int UserId { get; set; }
        public virtual UserProfile User { get; set; }
    
        [Key, Column(Order = 1)]
        public int RoleId { get; set; }
        public RoleModel Role { get; set; }
    }
    

    之后,您可以像这样向您的 UserProfile 模型添加一个新的导航属性:

    [Table("UserProfile")]
    public class UserProfile
    {
       [Key]
       [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
       public int UserId { get; set; }
       public string UserName { get; set; }
       public virtual ICollection<UsersInRole> UsersInRole { get; set; }
    }
    

    然后用类似这样的方式调用它:

    var context = new UsersContext();
    context.UserProfiles.First(d => d.UserName == "username").UsersInRole.Select(d => d.Role);
    

    但老实说,使用 @awright18 提到的 GetUsersInRole 方法可能更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      相关资源
      最近更新 更多