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

StackOverflow https://stackoverflow.com/questions/1126719

Вопрос

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

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

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

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

Это было полезно?

Решение

Майк, я верю, что то, что ты заметил, верно.Я работаю с ProfileProvider, который использует Azure TableStorage в качестве хранилища данных.Я хотел получить список профилей пользователей из базы данных и объединить их с информацией от поставщика членства.Потребовалось некоторое время, пока я не понял, что вызов ProfileBase.Create() с именем пользователя в качестве аргумента выполняет поиск по TableStorage и фактически извлекает данные, связанные с этим именем пользователя.Насколько я понимаю, вызов этого метода Создать() вводит в заблуждение, я бы ожидал Загрузка() или 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 это обеспечивает intellisense только во время разработки для пользовательских свойств профиля путем создания прокси-класса.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top