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> 

現在我想通過角色名來過濾所有用戶。但我沒有辦法做到這一點。
IE。像這樣的東西。​​
Users是一個組類型ICollection<Users>的的一個屬性)。如何在沒有角色班的情況下進入角色?

+0

啊我明白了,你就可以把它作爲與角色名欄的上下文DBSet表webpages_Roles到你的EF模型圖,然後就在roleMembership表和用戶表之間的用戶名聯接讓所有有具體的作用。 – 2013-02-12 03:56:08

+0

@LukeMcGregor,它實際上是一個通過webpages_UserRoles的多對多關係。我認爲還有更好的辦法。你有如何實現這一目標的例子嗎? – user194076 2013-02-12 03:59:11

+0

我通常不使用角色提供程序,並創建我自己的數據庫表 – 2013-02-12 04:16:20

回答

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; } 
    } 

通知我添加了兩個額外的DbSets。這些已經在會員數據庫中,這只是我們映射它們的方式。

「的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; } 
} 

之後,你可以一個新的導航屬性添加到您的用戶配置型號,像這樣:

[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); 

但在所有誠實,可能使用GetUsersInRole我由@ awright18提到的方法更容易。