2012-03-28 3 views
0

Ich habe eine Frage, wenn es um Lazy-Loading geht. Dazu verwende ich LinQ zu NHibernate, aber ich nehme an, dass es auch für andere LINQ to XX-Methoden gilt.Best-Practice: Lazy-Loading oder ALLE Eigenschaften erhalten

Stellen Sie sich einen Benutzer Tabel mit Spalte:

ID Namen Adresse Passwort (für dieses Beispiel: ebene, nicht gehasht)

Und stellen Sie sich eine Rolle Tabelle:

ID Name

Und von cour se, gibt es die Viele-zu-Viele-Tabelle UserRole (mit zusätzlichen Informationen wie CreateDate).

Wenn Sie nur die Namen bekommen der Rollen eines bestimmten Benutzer Sie dies über eifrig Lade mit der folgenden Abfrage können:

var roles = session.Query<User>().FetchMany(u => u.UserRoles) 
           .ThenFetch(ur => ur.Role) 
           .Single(u => u.Id == userId) 
           .UserRoles.Select(ug => new { ug.Role.Name }); 

Lazy- Laden:

var roles = session.Query<User>().Single(u => u.Id == userId) 
           .UserRoles.Select(ug => new { ug.Role.Name }); 

Die adva nages of eager-loading: Statt 2 oder 3 Aufrufe an die Datenbank jedes Mal, wenn Sie nur 1 Anruf haben Der Nachteil von eager-loading: Obwohl Sie sagen, Sie wollen nur den Namen zurückgegeben, die Abfrage selbst wird dazu führen, dass alle Eigenschaften aller enthaltenen Tabellen aus der Datenbank (einschließlich sensibler Informationen wie in unserem Beispiel Passwörter) und einmal in Ihrem Code wird es nur den Namen filtern.

Kann jemand einen Rat geben, welche dieser 2 Best-Practice? Oder gibt es einen anderen Weg, um zu laden, ohne alle Eigenschaften zu laden? Bitte keine Hinweise zur Verwendung gespeicherter Prozeduren.

Vielen Dank im Voraus,

Peter

Antwort

0

Zur Frage, ob oder nicht faul-Laden oder eifrig-Laden zu verwenden. Das hängt wirklich davon ab, was Ihre Benutzer öfter tun werden. Wenn Ihre Nutzer Ihre Mapping-Referenz zu über 50% berühren (* ich bin mir nicht sicher, was ein guter Prozentsatz ist, aber lassen Sie uns damit fortfahren), dann sollten Sie mit eifrigem Laden fortfahren. Andernfalls sollten Sie Lazy-Loading verwenden. Der Prozentsatz sollte wahrscheinlich in Abhängigkeit von den Kosten variieren, die von den Lasten verursacht werden.

Allerdings würde ich sagen, mit dem Standardverhalten der meisten ORM (Lazy-Loading) zu gehen, es sei denn, Sie haben tatsächlich ein Problem. Bleiben Sie mit dem ersten Motto KISS. :)

Das ist nur meine zwei Cent mindestens :)

+0

ich Ihre Vision zu verstehen. Aber was ist mit Sicherheit? Wie gefährlich ist es, wenn - zum Beispiel Bankkontonummern - aus der Datenbank an einen Client gesendet werden, während der Client es tatsächlich nicht benötigt? Die Datenübertragung zwischen der Datenbank und einem Client ist nicht gesichert, oder? – user825887

Verwandte Themen