Identity 2.0.0中的ApplicationUser和ApplicationRole导航属性

时间:2014-07-18 10:41:05

标签: c# asp.net-identity-2

在Identity 2.0.0中,我们在ApplicationUser中具有类型为IdentityUserRoles的Roles导航属性 我们在IdentityRole中具有相同类型IdentityUserRoles

的用户导航属性

这里是

namespace Microsoft.AspNet.Identity.EntityFramework
{
    // Summary:
    //     EntityType that represents a user belonging to a role
    //
    // Type parameters:
    //   TKey:
    public class IdentityUserRole<TKey>
    {
        public IdentityUserRole();

        // Summary:
        //     RoleId for the role
        public virtual TKey RoleId { get; set; }
        //
        // Summary:
        //     UserId for the user that is in the role
        public virtual TKey UserId { get; set; }
    }
}

所以,当我遍历context.Users我只能得到RoleId

有没有办法在ApplicationUser和ApplicationRole之间进行标准的多对多映射?

我希望能够做这样的事情

foreach (var user in ApplicationDbContextInstance.Users)
{
    List<ApplicationRole> UserRoles = user.Roles.ToList();
    /*
    some logic ... 
    */ 
}

更新

经过一些关于这个问题的工作,我找到了一个解决方案。 也许它不是那么优雅,但在我的情况下,我必须扩展IdentityUserRole与其他导航属性

我已将IdentityUserRole扩展到ApplicationUserRole并在所有解决方案中进行适当的更改。 这是我的新IdentityUserRole:

public class ApplicationUserRole : IdentityUserRole<string>
{
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
    public virtual ICollection<GeoSectorForUser> GeoSectors { get; set; }
}

现在我可以让所有用户担任以下角色:

foreach(ApplicationRole role in db.Roles){
    List<ApplicationUser> users = role.Users.Select(s => s.User).ToList();
}

在我的情况下,需要AplicationUserRole来存储其他导航属性,以便为我提供解决方案。 但我仍然想知道如何在IdentityUser和IdentityRole之间建立清晰的多对多关系

1 个答案:

答案 0 :(得分:2)

IdentityUser.Roles()为您提供了IdentityUserRole个对象的集合,这些对象仅包含RoleIdUserId个属性。要获取用户的Role个对象的集合,您应该使用RoleManager类(在我的头顶输入此内容,因此可能无法100%工作):

var roleManager = new RoleManager();

foreach (var user in ApplicationDbContextInstance.Users)
{
    List<IdentityUserRole> UserRoles = user.Roles.ToList();

    foreach(var userRole in UserRoles)
    {
        var role = roleManager.FindbyId(userRole.RoleId);
    }

}