ASP.NET SQL Profile Provider - метод ProfileBase.Create () поражает БД? - PullRequest
4 голосов
/ 14 июля 2009

Я работаю с SQLMemebershipProvider и использую профили. У меня есть пользовательский класс с именем UserProfile, который наследуется от класса ProfileBase, и я использую его для установки пользовательских свойств, таких как «FullName». Я хочу просмотреть всех пользователей в базе данных и получить доступ к их свойствам профиля. На каждой итерации я вызываю ProfileBase.Create (), чтобы получить новый профиль и затем получить доступ к свойствам.

Мне кажется, что каждый раз, когда вызывается ProfileBase.Create (), он попадает в мою базу данных SQL. Но я просто ищу подтверждение этому. Итак, кто-нибудь знает, действительно ли это каждый раз попадает в БД?

И, что еще лучше, есть ли у кого-нибудь лучшее решение, как я мог бы сделать один вызов в БД, чтобы получить всех пользователей с их пользовательскими атрибутами профиля?

Я знаю, что мог бы написать свой собственный сохраненный процесс, но мне интересно, есть ли способ, встроенный в поставщика членства.

Ответы [ 2 ]

4 голосов
/ 16 ноября 2009

Майк, я верю в то, что ты заметил, правда.Я работаю с ProfileProvider, который использует Azure TableStorage в качестве хранилища данных.Я хотел получить список профилей пользователей из базы данных и объединить их с информацией от поставщика членства.Прошло некоторое время, пока я не понял, что вызов ProfileBase.Create () с именем пользователя в качестве аргумента выполняет поиск в TableStorage и фактически возвращает данные, связанные с этим именем пользователя.Насколько я понимаю, вызов этого метода Create () вводит в заблуждение, я бы ожидал Load () или Get () .В настоящее время мой код выглядит следующим образом:

    public IEnumerable<AggregatedUser> GetAllAggregatedUsers()
    {
        ProfileInfoCollection allProfiles = this.GetAllUsersCore(
             ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All)
        );

        //AggregatedUser is simply a custom Class that holds all the properties (Email, FirstName) that are being used
        var allUsers = new List<AggregatedUser>();

        AggregatedUser currentUser = null;
        MembershipUser currentMember = null;
        foreach (ProfileInfo profile in allProfiles)
        {
            currentUser = null;
            // Fetch profile information from profile store
            ProfileBase webProfile = ProfileBase.Create(profile.UserName);
            // Fetch core information from membership store
            currentMember = Membership.FindUsersByName(profile.UserName)[profile.UserName];
            if (currentMember == null)
                continue;

            currentUser = new AggregatedUser();
            currentUser.Email = currentMember.Email;
            currentUser.FirstName = GetStringValue(webProfile, "FirstName");
            currentUser.LastName = GetStringValue(webProfile, "LastName");
            currentUser.Roles = Roles.GetRolesForUser(profile.UserName);
            currentUser.Username = profile.UserName;
            allUsers.Add(currentUser);
        }

        return allUsers;
    }

    private String GetStringValue(ProfileBase profile, String valueName)
    {
        if (profile == null)
            return String.Empty;
        var propValue = profile.PropertyValues[valueName];
        if (propValue == null)
            return String.Empty;

        return propValue.PropertyValue as String;
    }

Есть ли лучший (более простой, более производительный) способ

  1. получить всю информацию о профиле от поставщика профиля и
  2. объединить их с информацией о поставщике членства, чтобы показать их, например, на странице администратора?

Я смотрел на Конструктор веб-профилей , но IMO это обеспечивает тольковременной смысл для свойств пользовательского профиля путем создания прокси-класса.

0 голосов
/ 14 июля 2009

Вы не сохранитесь в базе данных, пока не наберете Save:

Метод Save пишет измененный значения свойств профиля для данных источник. Профильный провайдер может уменьшить количество активности на источник данных, выполняя только обновления когда свойство IsDirty установлено в правда. Это случай по умолчанию SqlProfileProvider.

...