2011-09-27 56 views
0

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

'UsersInRoles'实际上是一个多对多的关联表 - 所以如果EF对它进行建模,问题是什么。您应该能够使用关联的导航属性导航到用户的角色(并且反之)。 – VinayC

+0

@VinayC - 无法做到这一点,你可以与我分享的代码 – Bibhu

+0

看到我的答案 - 我相信你的选择部分有问题。 – VinayC

回答

0

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