2009-07-14 2 views
4

저는 SQLMemebershipProvider 및 Profiles를 사용하여 작업하고 있습니다. ProfileBase 클래스에서 상속 한 UserProfile이라는 사용자 지정 클래스가 있는데이를 사용하여 "FullName"과 같은 사용자 지정 속성을 설정합니다. 데이터베이스의 모든 사용자를 반복하여 프로필 속성에 액세스하려고합니다. 각 반복마다 ProfileBase.Create()를 호출하여 새 프로파일을 얻은 다음 속성에 액세스합니다.ASP.NET SQL 프로필 공급자 - ProfileBase.Create() 메서드가 DB에 영향을 줍니까?

ProfileBase.Create()가 SQL 데이터베이스를 조회 할 때마다 내 모습이 보입니다. 그러나 나는 이것에 대한 확인을 찾고 있습니다. 그래서, 이것이 실제로 DB를 매번 공격하는지 알 수 있습니까?

더 나은 방법은 누구든지 DB에 한 번 호출하여 사용자 정의 프로필 속성을 가진 모든 사용자를 얻을 수있는 방법에 대한 더 나은 해결책이 있습니까?

나는 자체 프로 시저를 저장할 수 있음을 알고 있지만 멤버십 공급자에게 내장 된 방법이 있는지 궁금해하고 있습니다. 당신이 Save를 호출 할 때까지

답변

4

마이크, 나는 당신이 관찰 한 것이 사실이라고 믿습니다. Azure TableStorage를 데이터 저장소로 사용하는 ProfileProvider를 사용 중입니다. 나는 데이터베이스에서 사용자 프로필 목록을 가져 와서 멤버쉽 공급자의 정보와 병합하려고했습니다. 인수로 사용자 이름을 사용하여 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

당신은 데이터베이스에 유지되지 않습니다 :

저장 방법은 기록 데이터 소스에 프로필 속성 값을 수정했습니다. 프로필 공급자는 의 IsDirty 속성을 true로 설정하면 업데이트 만 수행하여 데이터 원본에서 작업량을 줄일 수 있습니다. 기본 SqlProfileProvider의 경우입니다.

+0

저장 메서드가 호출되지 않습니다. 프로필과 사용자 지정 속성 만 검색하려고합니다. –

+0

Btw, 자동 저장 = true로 설정하면 프로필이 자동으로 업데이트됩니다 – EvgeniyK

관련 문제