Frage

Ich arbeite mit dem SQLMemebershipProvider und mit Profilen. Ich habe eine benutzerdefinierte Klasse namens Userprofile, die von den Profilen Klasse erbt, und ich benutze diese benutzerdefinierten Eigenschaften wie „Fullname“ zu setzen. Ich wünsche durch alle Nutzer in der Datenbank Schleife und erhalten Sie Zugriff auf ihre Profileigenschaften. Bei jeder Iteration I ProfileBase.Create () nenne ein neues Profil zu erhalten und dann die Eigenschaften zugreifen zu können.

Es scheint mir, wie jedes Mal, ProfileBase.Create () aufgerufen wird es meine SQL-Datenbank trifft. Aber ich bin nur die Suche nach Bestätigung. Also, weiß jemand, ob dies tatsächlich tut traf die DB jedes Mal?

Und noch besser, hat jemand eine bessere Lösung hat, wie ich einen Aufruf an die DB machen könnte alle Benutzer mit ihren benutzerdefinierten Profilattributen zu bekommen?

Ich weiß, ich könnte meine eigene gespeicherte Prozedur schreiben, aber ich frage mich, ob es einen Weg in die Membership Provider aufgebaut ist.

War es hilfreich?

Lösung

Mike, ich glaube, was Sie beobachtet wahr ist. Ich arbeite mit einem Profil, die Azure TableStorage als Datenspeicher verwendet. Ich wollte eine Liste der Benutzerprofile aus der Datenbank erhalten und kombinieren sie mit Informationen aus dem Mitgliedschaft-Anbieter. Es dauerte einige Zeit, bis ich erkannte, dass mit einem Benutzernamen als Argument ProfileBase.Create () Aufruf einer Lookup gegen TableStorage führt und tatsächlich ruft die mit diesem Benutzernamen zugeordneten Daten. Soweit es mich betrifft, diese Methode aufrufen Create () irreführend, ich würde erwarten, Load () oder Get () . Derzeit ist mein Code sieht wie folgt aus:

    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;
    }

Gibt es eine bessere (einfacher, leistungsfähigere) Art und Weise zu

  1. Rufen Sie alle benutzerdefinierten Profilinformationen aus Profilanbieter und
  2. kombiniere sie mit der Mitgliedschaft Anbieter Info ihnen zu zeigen, z.B. in einer Administrator-Seite?

Ich habe einen Blick auf Web Profile Builder aber IMO dies stellt nur Entwurfszeit Intellisense für individuelle Profileigenschaften durch eine Proxy-Klasse zu erzeugen.

Andere Tipps

Sie bleiben nicht in der Datenbank, bis Sie rufen Save :

  

Die Save-Methode schreibt geändert   Profil Eigenschaftswerte an den Daten   Quelle. Die Profil-Provider können   reduziert die Menge an Aktivität bei der   Datenquelle nur durch Ausführen Updates   wenn die IsDirty Eigenschaft auf   wahr. Dies ist der Fall für den Standard   SqlProfileProvider.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top