ASP.NET SQL Profil Provider - Ist die ProfileBase.Create () -Methode DB schlagen?
-
13-09-2019 - |
Frage
Ich arbeite mit dem SQLMemebershipProvider und mit Profilen. Ich habe eine benutzerdefinierte Klasse namens Userprofile, die von den Profilen Klasse erbt, und ich benutze diese benutzerdefinierten Eigenschaften wie „Fullname“ zu setzen. Ich wünsche durch alle Nutzer in der Datenbank Schleife und erhalten Sie Zugriff auf ihre Profileigenschaften. Bei jeder Iteration I ProfileBase.Create () nenne ein neues Profil zu erhalten und dann die Eigenschaften zugreifen zu können.
Es scheint mir, wie jedes Mal, ProfileBase.Create () aufgerufen wird es meine SQL-Datenbank trifft. Aber ich bin nur die Suche nach Bestätigung. Also, weiß jemand, ob dies tatsächlich tut traf die DB jedes Mal?
Und noch besser, hat jemand eine bessere Lösung hat, wie ich einen Aufruf an die DB machen könnte alle Benutzer mit ihren benutzerdefinierten Profilattributen zu bekommen?
Ich weiß, ich könnte meine eigene gespeicherte Prozedur schreiben, aber ich frage mich, ob es einen Weg in die Membership Provider aufgebaut ist.
Lösung
Mike, ich glaube, was Sie beobachtet wahr ist. Ich arbeite mit einem Profil, die Azure TableStorage als Datenspeicher verwendet. Ich wollte eine Liste der Benutzerprofile aus der Datenbank erhalten und kombinieren sie mit Informationen aus dem Mitgliedschaft-Anbieter. Es dauerte einige Zeit, bis ich erkannte, dass mit einem Benutzernamen als Argument ProfileBase.Create () Aufruf einer Lookup gegen TableStorage führt und tatsächlich ruft die mit diesem Benutzernamen zugeordneten Daten. Soweit es mich betrifft, diese Methode aufrufen Create () irreführend, ich würde erwarten, Load () oder Get () . Derzeit ist mein Code sieht wie folgt aus:
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;
}
Gibt es eine bessere (einfacher, leistungsfähigere) Art und Weise zu
- Rufen Sie alle benutzerdefinierten Profilinformationen aus Profilanbieter und
- kombiniere sie mit der Mitgliedschaft Anbieter Info ihnen zu zeigen, z.B. in einer Administrator-Seite?
Ich habe einen Blick auf Web Profile Builder aber IMO dies stellt nur Entwurfszeit Intellisense für individuelle Profileigenschaften durch eine Proxy-Klasse zu erzeugen.
Andere Tipps
Sie bleiben nicht in der Datenbank, bis Sie rufen Save
:
Die Save-Methode schreibt geändert Profil Eigenschaftswerte an den Daten Quelle. Die Profil-Provider können reduziert die Menge an Aktivität bei der Datenquelle nur durch Ausführen Updates wenn die IsDirty Eigenschaft auf wahr. Dies ist der Fall für den Standard SqlProfileProvider.