2009-07-14 11 views
4

私はSQLMemebershipProviderを使用し、プロファイルを使用しています。 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これが唯一のプロキシクラスを生成することによって、カスタムプロファイルプロパティのデザイン時のインテリセンスを提供します。

+0

ありがとうございます。とても有難い。 –

0

を保存する方法は、データ ソースに プロファイルプロパティの値を変更書き込みます。プロファイルプロバイダは、 のデータソースでアクティビティの量を減らすには、 にIsDirtyプロパティがtrueに設定されている場合にのみ、更新を実行して を実行します。これは、デフォルトの SqlProfileProviderの場合です。

+0

私はSaveメソッドを呼び出していません。私はプロファイルとそのカスタムプロパティを取得しようとしています。 –

+0

Btw、AutoSave = trueを設定した場合、プロフィールは自動的に更新されます – EvgeniyK

関連する問題