0

我有一个带有标准帐户控制器的常规 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=>x.RoleName=="Admin").Select(x=>x.FullName)
Users是 Group 类型的属性ICollection<Users>)。我如何在没有角色类的情况下获得角色?

4

2 回答 2

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

于 2013-02-12T04:16:48.687 回答
0

这是一个基于卢克建议的例子。

您的 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 方法更容易。

于 2013-02-12T05:09:56.710 回答