ASP.NET SQL 프로파일 공급자 - 프로파일베이스 .create () 메소드가 DB를 누르나요?
-
13-09-2019 - |
문제
SQLMememebershipprovider와 함께 작업하고 프로파일을 사용하고 있습니다. ProfileBase 클래스에서 상속되는 userProfile이라는 사용자 정의 클래스가 있으며이를 사용하여 "fullName"과 같은 사용자 정의 속성을 설정합니다. 데이터베이스의 모든 사용자를 살펴보고 프로필 속성에 액세스하고 싶습니다. 각 반복마다 profilebase.create ()를 호출하여 새 프로파일을 얻은 다음 속성에 액세스합니다.
프로파일베이스 (create) ()을 내 SQL 데이터베이스에 부딪히는 모든 시간마다 나처럼 보인다. 그러나 나는 단지 이것의 확인을 찾고 있습니다. 그렇다면 이것이 실제로 매번 DB에 도달했는지 아는 사람이 있습니까?
더 나은 방법으로, 누구든지 모든 사용자가 사용자 지정 프로필 속성을 가진 모든 사용자를 얻기 위해 DB를 호출 할 수있는 방법에 대한 더 나은 솔루션을 가지고 있습니까?
나는 내 자신의 저장된 Proc를 쓸 수 있다는 것을 알고 있지만 회원 공급자에게 내장 된 방법이 있는지 궁금합니다.
해결책
마이크, 나는 당신이 관찰 한 것이 사실이라고 믿습니다. Azure TableStorage를 데이터 저장소로 사용하는 ProfileProvider와 함께 일하고 있습니다. 데이터베이스에서 사용자 프로파일 목록을 얻고 멤버십 제공 업체의 정보와 병합하고 싶었습니다. 인수로서 사용자 이름을 가진 profilebase.create ()를 호출하는 데 시간이 걸렸을 때까지 시간이 걸렸습니다. 검색합니다 해당 사용자 이름과 관련된 데이터. 내가 염려하는 한이 방법을 부릅니다 만들다() 오해의 소지가 있습니다 짐() 또는 얻다(). 현재 내 코드는 다음과 같습니다.
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 이것은 프록시 클래스를 생성하여 사용자 정의 프로필 속성에 대한 설계 시간 지능 만 제공합니다.
다른 팁
전화 할 때까지 데이터베이스에 지속되지 않습니다 Save
:
저장 메소드는 수정 된 프로파일 속성 값을 데이터 소스에 씁니다. 프로파일 제공 업체는 ISDIRTY 속성이 TRUE로 설정된 경우에만 업데이트를 수행하여 데이터 소스에서 활동량을 줄일 수 있습니다. 이것은 기본 SQLPROFELEPROVIDER의 경우입니다.