我正在使用 SQLMemebershipProvider 并使用配置文件。我有一个名为 UserProfile 的自定义类,它继承自 ProfileBase 类,我使用它来设置“FullName”等自定义属性。我想循环访问数据库中的所有用户并访问他们的配置文件属性。在每次迭代中,我都会调用 ProfileBase.Create() 来获取新的配置文件,然后访问属性。

在我看来,每次调用 ProfileBase.Create() 时,它都会访问我的 SQL 数据库。但我只是在寻找对此的确认。那么,有谁知道这是否每次都会击中数据库?

更好的是,是否有人有更好的解决方案来帮助我一次调用数据库来获取所有用户的自定义配置文件属性?

我知道我可以编写自己的存储过程,但我想知道是否有一种内置于会员资格提供程序中的方法。

有帮助吗?

解决方案

迈克,我相信你所观察到的是真的。我正在使用使用 Azure TableStorage 作为数据存储的 ProfileProvider。我想从数据库中获取用户配置文件列表,并将它们与会员提供商的信息合并。我花了一些时间才意识到使用用户名作为参数调用 ProfileBase.Create() 会执行对 TableStorage 的查找,并且实际上 检索 与该用户名关联的数据。就我而言,调用这个方法 创造() 是误导性的,我希望 加载() 或者 得到()。目前我的代码如下所示:

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

有没有更好(更直接、更高效)的方法

  1. 从配置文件提供者检索所有自定义配置文件信息并
  2. 将它们与会员提供商信息合并以向他们显示,例如在管理员页面中?

我看过 网页配置文件生成器 但在我看来,这仅通过生成代理类为自定义配置文件属性提供设计时智能感知。

其他提示

您之前,请勿来电的 Save

  

Save方法写入改性   配置文件属性值的数据   资源。配置文件提供者可以   减少在活性的量   通过执行更新数据源只   当IsDirty属性设置为   真正。这是默认的情况下   的SqlProfileProvider。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top