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
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