Pergunta

Eu estou trabalhando com o SQLMemebershipProvider e usando perfis. Eu tenho uma classe personalizada chamada UserProfile que herda da classe ProfileBase e eu uso isso para definir as propriedades personalizadas como "FullName". Estou querendo percorrer todos os usuários do banco de dados e obter acesso às suas propriedades de perfil. Em cada iteração estou chamando ProfileBase.Create () para obter um novo perfil e, em seguida, acessar as propriedades.

Parece-me que todos os ProfileBase.Create time () é chamada, ela bate no meu banco de dados SQL. Mas eu estou apenas procurando por confirmação desta. Então, alguém sabe se isso de fato bater o DB cada vez?

E melhor ainda, alguém tem uma solução melhor de como eu poderia fazer uma chamada para o DB para obter todos os usuários com seus atributos de perfil personalizado?

Eu sei que eu poderia escrever meu próprio proc armazenados, mas eu estou querendo saber se existe uma maneira construído para o provedor de associação.

Foi útil?

Solução

Mike, eu acredito que você observou é verdade. Eu estou trabalhando com um ProfileProvider que usa Azure TableStorage como armazenamento de dados. Eu queria ter uma lista de perfis de usuário do banco de dados e fundi-los com informações do provedor de associação. Levou algum tempo até que eu percebi que chamar ProfileBase.Create () com um nome de usuário como executa argumento uma pesquisa contra TableStorage e realmente recupera os dados associados com esse nome de usuário. Tanto quanto eu estou em causa, chamar esse método Create () é enganosa, eu esperaria Load () ou Get () . Atualmente minha aparência código como este:

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

Existe uma melhor (mais simples, mais performant) maneira de

  1. recuperar todas as informações de perfil personalizado de provedor de perfil e
  2. fundi-los com informações provedor de associação para mostrar-lhes por exemplo em uma página de administrador?

Eu tive uma olhada Web Profile Builder mas IMO isso só fornece tempo de design intelliSense para propriedades de perfil personalizado através da geração de uma classe proxy.

Outras dicas

Você não persistem ao banco de dados até que você chamar Save :

O método Save escreve modificado Perfil valores de propriedade para os dados fonte. A lata provedor de perfil reduzir a quantidade de actividade no fonte de dados, atualizações atuando somente quando a propriedade IsDirty está definido para verdade. Este é o caso para o padrão SqlProfileProvider.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top