4

私は SQLMemebershipProvider を使用し、プロファイルを使用しています。ProfileBase クラスから継承する UserProfile というカスタム クラスがあり、これを使用して「FullName」などのカスタム プロパティを設定します。データベース内のすべてのユーザーをループして、プロファイル プロパティにアクセスしたいと考えています。各反復で、ProfileBase.Create() を呼び出して新しいプロファイルを取得し、プロパティにアクセスしています。

ProfileBase.Create() が呼び出されるたびに、SQL データベースにヒットするように見えます。しかし、私はこれの確認を探しています。それで、これが実際に毎回DBにヒットするかどうかは誰にもわかりますか?

さらに良いことに、カスタムプロファイル属性を持つすべてのユーザーを取得するために DB を 1 回呼び出す方法について、より良い解決策を誰かが持っていますか?

独自のストアド プロシージャを記述できることはわかっていますが、メンバーシップ プロバイダーに組み込まれた方法があるかどうか疑問に思っています。

4

2 に答える 2

4

マイク、あなたが観察したことは本当だと思います。AzureTableStorageをデータストアとして使用する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は、プロキシクラスを生成することにより、カスタムプロファイルプロパティのデザイン時インテリセンスのみを提供します。

于 2009-11-16T08:44:14.990 に答える
0

を呼び出すまで、データベースに永続化しませんSave

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

于 2009-07-14T17:09:28.193 に答える