2011-09-27 47 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()方法將拋出異常。此外,我不確定從應用程序邏輯的角度來看,只選擇第一個角色的名稱就足夠了。