【问题标题】:ASP.NET SQL Profile Provider - Does the ProfileBase.Create() method hit DB?ASP.NET SQL 配置文件提供程序 - ProfileBase.Create() 方法是否命中 DB?
【发布时间】:2010-11-10 17:37:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net sql membership profile provider


    【解决方案1】:

    迈克,我相信你观察到的是真的。我正在使用使用 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 仅通过生成代理类为自定义配置文件属性提供设计时智能感知。

    【讨论】:

    • 感谢您的澄清。非常感谢。
    【解决方案2】:

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

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

    【讨论】:

    • 我没有调用 Save 方法。我只是想检索配置文件及其自定义属性。
    • 顺便说一句,如果您设置 AutoSave=true 那么您的个人资料将自动更新
    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多