Поставщик профиля SQL ASP.NET - обращается ли метод ProfileBase.Create () к базе данных?

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

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

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

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


person Mike M    schedule 14.07.2009    source источник


Ответы (2)


Майк, я верю, что то, что ты заметил, правда. Я работаю с 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. объедините их с информацией о провайдере членства, чтобы показать их, например. на странице администратора?

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

person Masterfu    schedule 16.11.2009
comment
Спасибо за разъяснение. Очень признателен. - person Mike M; 18.11.2009

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

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

person Andrew Hare    schedule 14.07.2009
comment
Я не вызываю метод Save. Я только пытаюсь получить профили и их настраиваемые свойства. - person Mike M; 15.07.2009
comment
Кстати, если вы установите AutoSave = true, ваши профили будут обновляться автоматически - person EvgeniyK; 19.06.2013