2011-02-01 129 views
0

我使用EF 4和會員供應商隨ASP.Net 4.0一起發貨。EF - 導航屬性說明

我需要查找特定角色中的所有用戶並使用List<ListItem>填充DropDownList。

參與數據庫表:

aspnet_Roles 
aspnet_Users 
aspnet_UsersInRoles 

導航屬性從aspnet_Users到aspnet_Roles(使用結表aspnet_UsersInRoles)是:

myUser.aspnet_Roles 

匹配角色ID(GUID)「CE44ED48-E9F9-49C6-9E15 -E40EEFDC7479「)

我的腳本:

 using (CmsConnectionStringEntityDataModel context = new CmsConnectionStringEntityDataModel()) 
     { 
      IQueryable<aspnet_Users> userQuery = from aspnet_Users in context.aspnet_Users select aspnet_Users; 
      IQueryable<aspnet_Roles> roleQuery = from aspnet_Roles in context.aspnet_Roles select aspnet_Roles; 
      List<ListItem> myListUsersInRoles = new List<ListItem>(); 
      foreach (aspnet_Users myUser in userQuery) 
      { 
      // PROBLEM HERE 
      if (myUser.aspnet_Roles.ToString() == "CE44ED48-E9F9-49C6-9E15-E40EEFDC7479") 
       myListUsersInRoles.Add(new ListItem(myUser.UserName.ToString(), myUser.UserId.ToString())); 

      uxListUsers.DataSource = myListUsersInRoles; 
      uxListUsers.DataBind(); 
     }` 

問題: 如果總是返回FALSE,所以我無法填充列表<>。 我想我做錯了,如果一些屬性。

你有什麼想法嗎?謝謝你的時間。

回答

1

myUser.aspnet_RolesEntitySet<aspnet_Roles>(換句話說,一個集合角色的,所以這是極不可能的,這是字符串表示正好符合角色的字符串表示你的ID後面是。

有幾種方法,你可以修復它之一是:

// ... 
if (myUser.aspnet_Roles.Any(r => r.RoleId.ToString() == "CE44ED48-E9F9-49C6-9E15-E40EEFDC7479")) 
// ... 

還要注意的是from y in x select y只是一樣x,所以你可以寫

foreach (aspnet_User myUser in context.aspnet_Users) 
// ... 

而不用費神宣告userQueryroleQuery。 (你不會真的似乎可以用在任何地方roleQuery反正...)

此外,您可以查看使用會員/角色API中的一個角色來獲取用戶:

using System.Web.Security; // at the top of your file 
var usersInRole = Roles.GetUsersInRole("name of role here, NOT the guid"); 

注意,這返回一組用戶名,而不是用戶對象,所以你不得不做一些額外的工作來獲得用戶ID,但這是你可以考慮的事情...

+0

謝謝你的解釋。最後我明白它是如何工作的。我用if(myUser.aspnet_Roles.Any(r => r.RoleName ==「CMS-AUTHOR」)),它工作的很棒!我也會嘗試使用System.Web.Security作爲你的悲傷。非常感謝您的幫助! – GibboK 2011-02-01 12:05:31