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

时间:2011-09-27 07:08:32

标签: asp.net entity-framework membership

我在我的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();

1 个答案:

答案 0 :(得分:1)

假设EF在用户类中使用名为aspnet_Roles的导航属性建模多对多关联,则linq查询几乎是正确的。只有问题user.aspnet_Roles.TargetRoleName,您尝试在选择中为每个用户包含许多值(针对角色名称)。

请记住,每个用户都有很多角色。所以你可以尝试选择

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()方法将抛出异常。此外,我不确定从应用程序逻辑的角度来看,只选择第一个角色的名称是否足够。