【问题标题】:EF - Navigation property explanationEF - 导航属性说明
【发布时间】:2011-02-01 11:33:49
【问题描述】:

我使用 EF 4 和随 ASP.Net 4.0 提供的 Membership Provider。

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

涉及的数据库表有:

aspnet_Roles
aspnet_Users
aspnet_UsersInRoles

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

myUser.aspnet_Roles

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

问题: IF 总是返回 FALSE,所以我无法填充 List。 我想我在某些属性中做错了。

你有什么想法吗?感谢您的宝贵时间。

【问题讨论】:

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


    【解决方案1】:

    myUser.aspnet_Roles 是一个EntitySet&lt;aspnet_Roles&gt;(换句话说,一个角色的集合,因此它的字符串表示不太可能与您所追求的角色的 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)
    // ...
    

    不要费心声明userQuery 或roleQuery。 (你实际上似乎并没有在任何地方使用roleQuery...)

    此外,您可以查看使用 members/roles API 来获取角色中的用户:

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

    请注意,这会返回一个用户名数组,而不是用户对象,因此您必须做一些额外的工作才能获取用户 ID,但您可以考虑一下...

    【讨论】:

    • 感谢约翰的解释。最后我明白了它是如何工作的。我使用了 if (myUser.aspnet_Roles.Any(r => r.RoleName == "CMS-AUTHOR")) 并且效果很好!我也会尝试使用 System.Web.Security,因为你很伤心.. 再次非常感谢你的帮助!
    • 对不起,约翰,最后一件事......你能告诉我一个常见的使用 IQueryable 的例子吗?我是一个真正的初学者。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2020-05-23
    • 2018-10-22
    • 2018-10-10
    相关资源
    最近更新 更多