Pregunta

Estoy trabajando con el SQLMemebershipProvider y utilización de los perfiles. Tengo una clase personalizada llamada PerfilUsuario que hereda de la clase ProfileBase y yo utilizo para establecer las propiedades personalizadas como "Nombre completo". Estoy queriendo recorrer todos los usuarios en la base de datos y tener acceso a sus propiedades de perfil. En cada iteración Estoy llamando ProfileBase.Create () para obtener un nuevo perfil y luego acceder a las propiedades.

A mi me parece como cada vez ProfileBase.Create () se llama llegue a mi base de datos SQL. Pero estoy buscando para la confirmación de esto. Así que, ¿alguien sabe si esto de hecho golpeó la base de datos cada vez?

Y mejor aún, ¿alguien tiene una solución mejor de lo que podría hacer una llamada a la base de datos para obtener todos los usuarios con sus atributos de perfil personalizados?

Sé que podría escribir mi propio procedimiento almacenado, pero me pregunto si hay una manera integrada en el proveedor de pertenencia.

¿Fue útil?

Solución

Mike, creo que lo que se observa es cierto. Estoy trabajando con un ProfileProvider que utiliza Azure TableStorage como almacén de datos. Quería obtener una lista de perfiles de usuario de base de datos y los combina con la información del proveedor de pertenencia. Tomó algún tiempo hasta que me di cuenta de que llamar ProfileBase.Create () con un nombre de usuario como argumento realiza una búsqueda contra TableStorage y en realidad recupera los datos asociados con ese nombre de usuario. En lo que a mí respecta, llamar a este método Crear () es engañosa, yo esperaría Load () o Get () . Actualmente mi código es el siguiente:

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

¿Hay una manera mejor (más directo, con más prestaciones) a

  1. recuperar toda la información personalizada perfil de proveedor de perfil y
  2. fusionarlos con la información de proveedor de pertenencia para mostrarles por ejemplo, en una página de administrador?

He echado un vistazo a Perfil Web Builder pero En mi opinión esto sólo proporciona tiempo de diseño intellisense para las propiedades de perfil personalizado mediante la generación de una clase de proxy.

Otros consejos

no persisten a la base de datos hasta que llame Save :

  

El método Save escribe modificado   valores de las propiedades de perfil a los datos   fuente. El proveedor de perfil puede   reducir la cantidad de actividad en el   fuente de datos mediante actualizaciones dinámicas únicamente   cuando la propiedad se establece en IsDirty   cierto. Este es el caso para el valor por defecto   SqlProfileProvider.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top