ASP.NET Поставщик профиля SQL - Попадает ли в базу данных ProfileBase.Метод Create() попадает в базу данных?
-
13-09-2019 - |
Вопрос
Я работаю с 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;
}
Есть ли лучший (более простой, более производительный) способ
- извлеките всю информацию пользовательского профиля из поставщика профиля и
- объедините их с информацией о поставщике членства, чтобы показать их, напримерна странице администратора?
Я взглянул на Конструктор веб-профилей но IMO это обеспечивает intellisense только во время разработки для пользовательских свойств профиля путем создания прокси-класса.
Другие советы
Вы не сохраняетесь в базе данных до тех пор, пока не вызовете Save
:
Метод сохранения записывает измененные значения свойств профиля в данные источник.Поставщик профиля может уменьшить объем активности в источнике данных , выполняя обновления только когда свойству IsDirty присвоено значение true.Это относится к значению по умолчанию SqlProfileProvider.