我使用ASP.NET标识实现了用户和角色的标准实现:
public class User : IdentityUserBase { }
public class Role : IdentityRoleBase { }
public class UserRole : IdentityUserRoleBase { }
我需要User类中的一个属性或方法来返回用户的(第一个)角色(在我的应用中,每个用户只能有一个):
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中执行此操作?
我知道可以在UI层使用像RoleManager,DbContext或HTTPContext这样的全局对象,但是我无法访问User类中的那些(并且不想使用将它们作为参数传递。
我原本以为这必须是一个标准的用例,但我无法找到答案......我的问题与this one基本相同,但我需要访问其中的角色信息用户对象本身。
答案 0 :(得分:1)
首先,您不应该将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();
答案 1 :(得分:0)
这有效:
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
属性现在通过UserRole
对象提供的User
属性公开。
回顾ASP.NET身份here的演变,这些属性默认情况下在版本1中出现在IdentityUserRole
中,但随后在版本2中删除,以便支持通用主键,建议使用UserManager
类。但是,这对像我这样的情况没有帮助,这些情况需要在DAL中完成操作,并且不能轻松访问这个类(或任何上下文类)。鉴于我永远不会有任何其他类型的主键,这样做感觉非常安全。