4

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

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

更好的是,有没有人有更好的解决方案来解决我如何拨打数据库以获取所有用户的自定义配置文件属性?

我知道我可以编写自己的存储过程,但我想知道 Membership Provider 是否有内置方法。

4

2 回答 2

4

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

    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. 将它们与会员提供者信息合并以显示它们,例如在管理员页面中?

我看过Web Profile Builder但 IMO 仅通过生成代理类为自定义配置文件属性提供设计时智能感知。

于 2009-11-16T08:44:14.990 回答
0

在调用之前,您不会持久保存到数据库Save

Save 方法将修改后的配置文件属性值写入数据源。配置文件提供程序可以通过仅在 IsDirty 属性设置为 true 时执行更新来减少数据源的活动量。这是默认 SqlProfileProvider 的情况。

于 2009-07-14T17:09:28.193 回答