2009-07-14 13 views
4

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

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

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

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

ответ

4

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

+0

Благодарим вас за разъяснения. Очень признателен. –

0

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

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

+0

Я не называю метод Save. Я только пытаюсь получить профили и их пользовательские свойства. –

+0

Кстати, если вы установите AutoSave = true, ваши профили будут автоматически обновлены. – EvgeniyK

 Смежные вопросы

  • Нет связанных вопросов^_^