我正在使用SQLMemebershipProvider并使用配置文件。我有一个名为UserProfile的自定义类,该类继承自ProfileBase类,并使用它来设置自定义属性,例如“ FullName”。我想遍历数据库中的所有用户并获得对其配置文件属性的访问。在每次迭代中,我都调用ProfileBase.Create()以获得新的配置文件,然后访问属性。
在我看来,每次调用ProfileBase.Create()都会命中我的SQL数据库。但我只是在寻求确认。那么,有谁知道这是否真的每次都击中了DB?
更好的是,还有谁能更好地解决我如何调用数据库以使所有用户拥有其自定义配置文件属性的更好的解决方案?
我知道我可以编写自己的存储proc,但是我想知道是否可以在Membership Provider中内置一种方法。
迈克,我相信您的观察是正确的。我正在使用将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; }
有没有更好的方法(更直接,更高效)
我看过Web Profile Builder,但是IMO仅通过生成代理类为自定义配置文件属性提供设计时的智能感知。