Laden...

BestPractice: Datenobjekte mit Objekthierarchien laden?

Erstellt von #coder# vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.726 Views
#coder# Themenstarter:in
395 Beiträge seit 2008
vor 12 Jahren
BestPractice: Datenobjekte mit Objekthierarchien laden?

Hallo, ich entwickle eine Anwendung und habe das Datenbankmodell fertiggestellt. Nun bin ich dabei das Objektmodell zu erstellen und stoße auf ein paar Fragen, wie man z.B. referenzierte Objekte lädt. Also z.B. eine Klasse Customer hat mehrere Bestellungen:

class Customer
{
     public List<Order> Orders { get; set;}
}

Orders haben wiederum Unterobjekte (Articles.. usw.)

Soll die Customer Repository um das Laden aller Objekte kümmern, oder wäre es besser nur die Ids, also die Referenzen zu laden? Beim letzteren müsste je nach Kontext Daten nachgeladen werden.

Hoffe auf paar Tipps von euch 😃

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo #coder#,

Soll die Customer Repository um das Laden aller Objekte kümmern, oder wäre es besser nur die Ids, also die Referenzen zu laden? Beim letzteren müsste je nach Kontext Daten nachgeladen werden.

Wenn du die Customers lädst und der O/R-Mapper lazy-loading unterstützt werden die Orders für den jeweiligen Customer nachgeladen, wenn darauf zugegriffen wird.

Sonst würde ich im OrdersRepository eine Methode LoadOrdersForCuster(Customer customer) einbauen, damit die Orders für den übergegebenen Customer geholt werden können.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

#coder# Themenstarter:in
395 Beiträge seit 2008
vor 12 Jahren

Momentan hab ich noch kein O/R Mapper, bzw klasissisches ADO.NET ausgewählt, die Frage ist, womit hätte man weniger Arbeit? Die Datenbank steht, mit dem Entity Framework 4.1 würden ja alle Objekte automatisch generiert.

Ein Problem ist, das die Anwendung mit SharePoint 2010 laufen muss, da SP2010 auf .NET 2.0 Runtimer setzt, und EF4.1 auf 4.0 könnte es zu Problemen kommen.

Welche Zugriffstechnologie würdet ihr mir empfehlen?

1.564 Beiträge seit 2007
vor 12 Jahren

Hallo #coder#

Die Datenbank steht, mit dem Entity Framework 4.1

Nope, ist alles Konfigurationssache. Nur wenn das Code-First Template verwendest wird davon ausgegangen, dass du noch keine DB hast. Wenn du das Standard-Template, das Change-Tracking Entities Template oder einfach gar keines verwendest kannst du dir das Modell aus einer bestehenden DB erzeugen lassen.

Ein Problem ist, das die Anwendung mit SharePoint 2010 laufen muss

Das verstehe ich jetzt nicht. Meinst du die Anwendung muss auf dem gleichen Server laufen auf dem der SharePoint installiert ist und da darf kein neuer .NET Framework installiert werden? Ansonsten wird es dem SharePoint doch recht egal sein welche .NET Version die Clients haben, oder?

Zum Laden deiner Orders schließe ich mich Gü's Vorschlag an. ORM mit Lazy Loading oder Order-Repository und LoadForCustomer Methode. Das lässt sich recht gut mit der .NET 4.0 Lazy<T> Klasse realisieren.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

#coder# Themenstarter:in
395 Beiträge seit 2008
vor 12 Jahren

Welche anderen Practices gibt es noch, wenn man z.b. nach dem klassischen Modell entwickelt. Sollen alle unter Objekte geladen werden, auch wenn diese nicht verwendet werden sollen? Was ist wenn Unterobjekte die nicht geladen wurden, später von anderen Entwicklern aufgerufen werden -> Null Reference!! usw.

Ich suche nach einem anderen Konzept als O/R LazzyLoading, da es nicht genutzt werden soll, wie wurde es früher gelöst?

1.564 Beiträge seit 2007
vor 12 Jahren

Lazy Loading hat nichts mit ORM oder nicht ORM zu tun, es ist nur so das einige das out-of-the-box unterstützen.

Lazy Loading ist ein Pattern, nicht eine Erfindung von O/R-Mappern, und kann natürlich auch mit native ADO.NET realisiert werden. Die Frage die du dir beantworten musst ist "Lazy Loading" oder "Eager Loading". Beide Ansätze haben Vor- und Nachteile und die musst du in deinem Projekt gegeneinander abwiegen.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

#coder# Themenstarter:in
395 Beiträge seit 2008
vor 12 Jahren

Das es sich hierbei noch um eine verteilte Anwendung handeln soll, gibt es Vor- und Nachteile die entstehen, wenn alle Objekte geladen werden sollen. Auf dem Server können die Objekte mit den Sub-Objekten initialisiert werden, aber es gibt Fälle, bei denen Objekte über eine WCF Schnittstelle zu Mobile Clients übertragen werden soll.
Um nicht den ganzen Objektbaum zu serialisieren und zu verschicken, würde sich hier eine Proxy Klasse anbieten, die nur die relevanten Informationen überträgt, empfängt. Es gibt z.B. den Fall das alle **Order **Objekte übertragen werden sollen, aber ohne die jeweiligen Arikel. Erst wenn der Client eine **Order **ausgewählt hat, sollen die jeweiligen **Artikel **übertragen werden.
Mit einem Datenobjekt müssen alle abgedeckt werden.

Vielleicht habt ihr noch weitere Tipps, Practices, Erfahrungen.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo #coder#,

Lazy-Loading ist dann schon das Stichwort das du braucht. Es lässt sich - wie Flo bereits erwähnt hat - auch ohne O/R-Mapper umsetzen, indem ein Virtual Proxy gebaut wird. Suche mal nach diesem Stichwort. Das kannst du dann auch für WCF umsetzen. Hierzu ist es notwendig - bzw. so würde ich es dann lösen - dass der Client diesen "Virtual Proxy" umsetzt und bei Bedarf die referenzierten Entitäten nachlädt. Idealerweise in einen lokalen Cache auf dem Client (-> Identity Map) um mehrfaches Nachladen zu vermeiden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo #coder#,

Lazy-Loading ist dann schon das Stichwort

auch fürs Forum. Das wurde schon öfter besprochen. Du kannst gerne die besten Treffer posten.

herbivore