EF - 导航属性说明

时间:2011-02-01 11:33:50

标签: c# asp.net entity-framework-4

我使用随ASP.Net 4.0发布的EF 4和会员提供商。

我需要找到特定角色的所有用户并使用List<ListItem>填充DropDownList。

涉及的数据库表是:

aspnet_Roles
aspnet_Users
aspnet_UsersInRoles

从aspnet_Users到aspnet_Roles的导航属性(使用联结表aspnet_UsersInRoles)是:

myUser.aspnet_Roles

匹配RoleID(指导)“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();
        }`

问题: IF总是返回FALSE,因此我无法填充List&lt;&gt;。 我想如果有一些属性我做错了。

你有什么想法吗?谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

myUser.aspnet_Roles是一个EntitySet<aspnet_Roles>(换句话说,集合的角色,因此它的字符串表示形式与角色的字符串表示形式匹配的可能性极小'在ID之后。

有几种方法可以修复它。一个是:

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

另请注意,from y in x select yx相同,因此您可以写

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,但这是您可以考虑的事情......