Question

Je travaille avec le SQLMemebershipProvider et l'utilisation des profils. J'ai une classe personnalisée appelée UserProfile qui hérite de la classe ProfileBase et j'utilise ceci pour définir des propriétés personnalisées comme « FullName ». Je suis désireux de boucle à travers tous les utilisateurs de la base de données et obtenir l'accès à leurs propriétés de profil. A chaque itération, je fais appel ProfileBase.Create () pour obtenir un nouveau profil, puis accéder aux propriétés.

Il me semble que chaque fois ProfileBase.Create () est appelée il frappe ma base de données SQL. Mais je suis en train de chercher la confirmation. Alors, est-ce que quelqu'un sait si cela ne touche en fait la base de données à chaque fois?

Et mieux encore, quelqu'un at-il une meilleure solution de la façon dont je pourrais faire un appel à la DB pour obtenir tous les utilisateurs avec leurs attributs de profil personnalisés?

Je sais que je pourrais écrire mon propre procédure stockée, mais je me demande s'il y a un moyen construit au fournisseur d'appartenances.

Était-ce utile?

La solution

Mike, je crois que vous avez observé est vrai. Je travaille avec un ProfileProvider qui utilise Azure TableStorage comme banque de données. Je voulais obtenir une liste des profils d'utilisateurs de la base de données et de les fusionner avec des informations de fournisseur d'appartenances. Il a fallu un certain temps jusqu'à ce que je me suis aperçu que l'appel ProfileBase.Create () avec un nom d'utilisateur comme argument effectue une recherche contre TableStorage et en fait récupère les données associées à ce nom d'utilisateur. En ce qui me concerne, appeler cette méthode Créer () est trompeur, je me attends Load () ou get () . mon code ressemble actuellement à ceci:

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

Y at-il une meilleure (plus simple, plus performante) façon de

  1. récupérer toutes les informations personnalisées profil de fournisseur de profil et
  2. les fusionner avec des informations de fournisseur d'appartenances pour leur montrer par exemple dans une page d'administrateur?

J'ai eu un coup d'œil à Profil Web Builder mais l'OMI ne fournit que cette conception du temps intellisense pour les propriétés de profil personnalisé en générant une classe proxy.

Autres conseils

Vous ne persistez pas à la base de données jusqu'à ce que vous appelez Save :

  

La méthode Save modifiée écritures   les valeurs des propriétés de profil aux données   la source. Le fournisseur de profil peut   réduire la quantité d'activité au   source de données en effectuant des mises à jour uniquement   lorsque la propriété est définie sur IsDirty   vrai. Tel est le cas pour la valeur par défaut   SqlProfileProvider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top