如何在使用实体框架时获取所有用户角色
Posted
技术标签:
【中文标题】如何在使用实体框架时获取所有用户角色【英文标题】:how to get all user roles while using entity framework 【发布时间】:2011-09-27 07:08:32 【问题描述】:我在我的 asp.net 应用程序中使用实体框架和成员资格。
在其中一个页面中,我需要通过加入“aspnet_Membership”、“aspnet_Users”、“aspnet_Roles”和“aspnet_UsersInRoles”表来显示所有用户和角色。
但是,每当我尝试在 .edmx 中添加所有这些表时,都不会创建“aspnet_UsersInRoles”实体,而是“aspnet_Users”和“aspnet_Roles”与多对多关联相关联。而且我无法引用“aspnet_UsersInRoles”表,它会引发编译错误。
请帮我获取用户角色,这是我的链接查询
var users = (from membership in IAutoEntity.aspnet_Membership
from user in IAutoEntity.aspnet_Users
from role in IAutoEntity.aspnet_Roles
where membership.IsApproved == true & membership.UserId == user.UserId
select new user.UserName, membership.Email, user.aspnet_Roles.TargetRoleName, membership.CreateDate, user.LastActivityDate, membership.IsApproved ).ToList();
【问题讨论】:
UsersInRoles
实际上是一个多对多关联表 - 那么如果 EF 对其建模有什么问题。您应该能够使用关联的导航属性导航到用户的角色(反之亦然)。
@VinayC - 无法做到这一点,您可以与我分享代码
查看我的回答 - 我相信您的选择部分存在问题。
【参考方案1】:
假设 EF 正在建模与用户类中名为 aspnet_Roles
的导航属性的多对多关联,那么您的 linq 查询几乎是正确的。唯一的问题是 user.aspnet_Roles.TargetRoleName
您曾尝试在选择中为每个用户包含许多值(用于角色名称)。
请记住,每个用户都有多个角色。所以你可以试试select as
select new user.UserName, membership.Email, user.aspnet_Roles, membership.CreateDate ...
请注意,您将获得每个用户的角色集合,即 users[0].aspnet_roles
将是集合。
如果保证总是有一个角色与用户相关联,那么您可以使用诸如
之类的语法select new user.UserName, membership.Email, user.aspnet_Roles.First().TargetRoleName, membership.CreateDate ...
请注意,我们从与用户关联的角色中选择第一个角色的名称。如果用户没有角色,则First()
方法将抛出异常。此外,从应用程序逻辑的角度来看,我不确定是否只选择第一个角色的名称就足够了。
【讨论】:
以上是关于如何在使用实体框架时获取所有用户角色的主要内容,如果未能解决你的问题,请参考以下文章
如何在 _LoginPartial 的代码部分中获取用户角色?
如何使用实体框架中的 DBContext 获取在另一列中具有重复数据的所有 ID?