Как правильно подключить таблицу пользователей к таблице членства, или вы должны это сделать? - PullRequest
2 голосов
/ 01 июля 2011

Я, вероятно, поступаю неправильно, пожалуйста, поправьте меня.

В настоящее время у меня есть модель пользователя с именем U_USER, она содержит поля, такие как адрес, receiveNotifications, HasCompanyCar и т. Д.

Эти пользователи имеют роли в таблице членства .NET.Когда пользователь входит в систему через членство, я получаю его запись в базе данных следующим образом (имя пользователя в таблице членства и в моей собственной таблице U_USER будут совпадать):

        //Gets the current user
        public U_USER CurrentUser()
        {
            return GetUser(HttpContext.Current.User.Identity.Name);
        }

        //Gets user details by username
        public U_USER GetUser(String username)
        {
            return (from u in db.U_USER
                   where u.UserName == username
                   select u).FirstOrDefault();
        }

Если я хочу получитьсписок всех пользователей, скажем, в роли «Создать», тогда я бы сделал это:

allUsers.Where(x => Roles.IsUserInRole(x.UserName, "Create"))

Это большой удар по производительности, так как он выполняет поиск для каждой итерации пользователя.Это заставляет меня думать, что я не собираюсь правильно управлять пользователями.Итак, чтобы ответить на этот вопрос:

Как правильно подключить членство к таблице пользователей, которая, в свою очередь, связана с остальными вашими данными?Я бы также согласился с тем, как сделать это более эффективно!

Большое спасибо:)

РЕДАКТИРОВАТЬ:

Я увеличил производительность благодарякод ниже.Я получаю пользователей в роли одним махом, а затем фильтрую их.

String[] usersInRole = Roles.GetUsersInRole("CanApprove");
users = users.Where(x => usersInRole.Any(y => y == x.UserName));

Но я все еще совершенно уверен, что я поступаю об этом ВСЕ неправильно!

Ответы [ 2 ]

3 голосов
/ 02 июля 2011

Не эксперт в этом, но то, что обычно делают мои приложения, - это использовать внешний ключ (с индексом) из моей собственной таблицы Users в таблицу Membership Users, используя поле Guid с Membership.Затем это позволяет мне выполнять запросы с использованием Linq, например:

 var query = from myUser in MyUsers
            join aspUser in aspnet_Users on myUser.UserId equals aspUser.UserId
            join usersInRole in aspnet_UsersInRoles on aspUser.UserId equals usersInRole.UserId
            join role in aspnet_Roles on usersInRole.RoleId equals role.RoleId
            where role ...
            select new { ... };

(или вы можете использовать точечную форму, например myUser.AspUser.Roles.Role, чтобы ORM генерировал объединения, если вы предпочитаете)

Дляпроизводительность, хорошо наблюдать время от времени трассировку SQL - убедитесь, что вы не делаете слишком много циклических обходов SQL для каждого логического шага в коде.

Надеюсь, это немного поможет.


Обновление - в ответ на ваши вопросы о «если вы вообще это сделаете», я думаю «да», но есть и другие доступные варианты - например, вы можете использовать Profile поля - см. Шаг 6 в этом великом пошаговом руководстве - http://www.4guysfromrolla.com/articles/120705-1.aspx

0 голосов
/ 02 июля 2011

Мы создали сущности EntityFramework для всех таблиц членства в AspNet, что позволяет нам запрашивать их, как и любую другую сущность.

Не уверен, что это то, что вам нужно, но может помочь

...