Domanda

sto lavorando con lo SQLMemebershipProvider e l'utilizzo di profili. Ho una classe personalizzata denominata UserProfile che eredita dalla classe ProfileBase e Io lo uso per impostare le proprietà personalizzate come "FullName". Sono voler scorrere tutti gli utenti nel database e ottenere l'accesso alle loro proprietà di profilo. Su ogni iterazione che io chiamo ProfileBase.Create () per ottenere un nuovo profilo e quindi accedere alle proprietà.

Sembra a me che ogni volta ProfileBase.Create () viene chiamato colpisce il mio database SQL. Ma io sono solo in cerca di conferma. Così, qualcuno sa se questo in effetti ha colpito il DB ogni volta?

E meglio ancora, qualcuno ha una soluzione migliore di come ho potuto fare una chiamata al DB per ottenere tutti gli utenti con i loro attributi profilo personalizzato?

So che avrei potuto scrivere il mio proc memorizzato, ma mi chiedo se c'è un modo integrato al provider di appartenenze.

È stato utile?

Soluzione

Mike, credo che ciò che si osserva è vero. Sto lavorando con un ProfileProvider che utilizza Azure TableStorage come archivio dati. Volevo ottenere un elenco di profili utente dal database e unirli con informazioni provenienti da provider di appartenenze. C'è voluto un po 'di tempo fino a quando mi sono reso conto che la chiamata ProfileBase.Create () con un nome utente come argomento esegue una ricerca contro TableStorage ed effettivamente recupera i dati associati a tale nome utente. Per quanto mi riguarda, la chiamata a questo metodo di Create () è fuorviante, mi sarei aspettato Load () o get () . Attualmente il mio codice è simile al seguente:

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

Esiste un migliore (più performante più semplice,) modo per

  1. recuperare tutte le informazioni del profilo personalizzato dal provider di profili e
  2. unirle con info provider di appartenenze per mostrare loro esempio in una pagina di amministratore?

Ho dato un'occhiata al Web Profile Builder ma IMO questo fornisce solo in fase di progettazione intelliSense per le proprietà del profilo personalizzato mediante la generazione di una classe proxy.

Altri suggerimenti

Non si ostini nel database fino a quando si chiama Save :

  

Il metodo Save scrive modificata   i valori delle proprietà del profilo per i dati   fonte. Il provider profilo può   ridurre la quantità di attività al   fonte di dati da aggiornamenti dello spettacolo solo   quando la proprietà è impostata su IsDirty   vero. Questo è il caso per il default   SqlProfileProvider.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top