如何在使用实体框架时获取所有用户角色

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?

如何在实体框架 ASP > NET 中获取给定列表中具有所有 id 的所有实体

如何使用实体框架连接三个表来获取所有数据