ASP.NET SQL资料提供商 - 请问ProfileBase.Create()方法打DB?(AS

2019-06-25 21:53发布

我与SQLMemebershipProvider工作,并使用配置文件。 我有一个叫做用户配置自定义类从ProfileBase类继承和我使用它来设置自定义属性,如“全名”。 我通过在数据库中的所有用户希望循环并访问他们的个人资料的属性。 在每次迭代我打电话ProfileBase.Create()得到一个新的配置文件,然后访问属性。

它看起来对我来说,每一次ProfileBase.Create()被调用它击中我的SQL数据库。 但我只是寻找证实这一点。 因此,没有人知道,如果这样做其实每次打DB?

更棒的是,没有任何人有我怎么可能打一个电话,到DB一个更好的解决方案,以获得他们的自定义配置文件属性的所有用户?

我知道我可以写我自己的存储过程,但我不知道是否有内置的成员资格提供一种方式。

Answer 1:

迈克,我相信你观察到的是真实的。 我与使用Azure的TableStorage作为数据存储中ProfileProvider工作。 我想从数据库中获取的用户配置文件的列表,并与成员提供的信息合并。 过了一段时间,直到我意识到有一个用户名作为参数调用ProfileBase.Create()执行对TableStorage查找和实际上获得与该用户名相关的数据。 就我而言,调用此方法创建()是一种误导,我希望load()获得()。 目前我的代码如下所示:

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

我有看网页的资料创建 ,但IMO这只能通过生成的代理类提供设计时智能感知自定义配置文件属性。



Answer 2:

你不坚持,直到你调用数据库Save

保存方法写入修改的分布属性值提供给数据源。 概况提供者可以通过执行更新减少活动在数据源中的量,只有当IsDirty属性设置为true。 这是默认的SqlProfileProvider的情况。



文章来源: ASP.NET SQL Profile Provider - Does the ProfileBase.Create() method hit DB?