我使用ASP.NET身份有一个bog标准的用户和角色实现:
public class User : IdentityUserBase { }
public class Role : IdentityRoleBase { }
public class UserRole : IdentityUserRoleBase { }
我需要用户类中的属性或方法,该属性或方法返回用户的(第一个(角色(在我的应用中,每个用户只能有一个(:
public class User : IdentityUserBase
{
// ...
public Role GetRole()
{
return this.Roles.FirstOrDefault(); // this actually returns a UserRole object, with only a UserId and a RoleId available (no Role object)
}
}
有没有办法在DAL中进行此操作?
我知道使用Rolemanager,dbcontext或httpcontext等全局对象在UI层上可以使用,但是我无法访问用户类中的对象(并且不想将其作为参数作为参数(。<<<<<<<<<<<<<<<<<<<<<<<</p>
我本来以为这一定是标准用例,但找不到答案...我的问题基本上与这个问题相同,但是我需要访问用户对象本身中的角色信息。
首先,您不应该将GetRole
方法放在User
类中,请保持这些模型简单清洁。
要获得用户的角色,您需要DB上下文和用户ID,您可以执行此操作:
var userId = ...; //Get the User ID from somewhere
var roles = context.Roles
.Where(r => r.Users.Any(u => u.UserId == userId))
.ToList();
这有效:
public class UserRole : IdentityUserRoleBase
{
public virtual Role Role { get; set; } // add this to see roles
public virtual User User { get; set; } // add this to see users
}
User
和Role
属性现在通过User
对象可用的UserRole
属性暴露。
回顾一下此处的ASP.NET身份的演变,默认情况下,IdentityUserRole
中存在这些属性,但随后在版本2中删除,以支持通用主键,并建议使用UserManager
类。但是,这无助于像我这样的案例,在DAL中需要进行操作,并且不容易访问此类(或任何上下文类(。鉴于我永远不会有任何其他类型的主键,所以这样做是很安全的。