EF - объяснение свойств навигации - PullRequest
0 голосов
/ 01 февраля 2011

Я использую EF 4 и поставщика членства, поставляемого с ASP.Net 4.0.

Мне нужно найти всех пользователей в определенной роли и заполнить DropDownList с помощью List<ListItem>.

Используемые таблицы базы данных:

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

Проблемы: Если всегда возвращать FALSE, я не могу заполнить List <>. Я полагаю, что я делаю неправильно, если некоторые свойства.

У вас есть идеи? Спасибо за ваше время.

1 Ответ

1 голос
/ 01 февраля 2011

myUser.aspnet_Roles - это EntitySet<aspnet_Roles> (другими словами, коллекция ролей, поэтому маловероятно, что его строковое представление будет соответствовать строковому представлению роли, за которой вы идете.

Есть несколько способов исправить это. Один из них:

// ...
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 в любом случае ...)

Кроме того, вы можете посмотреть на использование API членства / ролей для извлечения пользователей в роли:

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

Обратите внимание, что это возвращает массив имен пользователей, а не объектов пользователя, поэтому вам придется проделать небольшую дополнительную работу, чтобы получить идентификатор пользователя, но вы можете подумать об этом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...