4 Stimmen

.NET - ORMs und alle möglichen Kombinationen - ViewModel?

Wie würden Sie dieses Problem mit einem ORM angehen? Dies ist ein hypothetisches (vereinfachtes) Beispiel:

Ich habe eine Tabelle der Städte:
1 - New York
2 - London
3 - San Francisco
4 - New Orleans

Ich habe eine Punktetabelle: (erste Spalte Eindeutiger Primärschlüssel, zweiter Monatscode, dritter FK zu Stadt, vierter Punktestand (int))
1 - 352 - 1 - 9
2 - 352 - 2 - 10

Für den Monat 352 werden nur New York und London genannt.

Wenn ich dies einem Benutzer in einer Benutzeroberfläche präsentiere, möchte ich ein Raster mit allen 4 Städten für diesen Monat. Und Nullen (Leerzeichen) für die Städte San Fran und New Orleans.

Was ist der beste Ansatz für diese Aufgabe mit einem ORM? Bringen Sie Ihre Business-Objekte in "Model"-Form zurück und transformieren Sie sie dann in eine "Viewmodel"-Form? Wie haben Sie ähnliche Situationen in ORMs gehandhabt? Ich habe dies bereits in ADO.NET mit meinen SQL-Anweisungen gehandhabt, habe dies aber noch nie in einem ORM getan und suche nach Ratschlägen, Anleitungen oder einem Ansatz.

2voto

Shane Courtrille Punkte 13622

Wir praktizieren tatsächlich eine Form von Command Query Separation (Greg Young-Version - nicht die Meyer-Version), so dass wir zumindest die NHibernate ICriteria verwenden würden, um die Details auszuwählen, die wir wollen, und dann den AliasToBeanTransformer verwenden, um sie direkt in ein DTO zu injizieren.

Für unsere komplexesten Entitäten haben wir eine separate Tabelle, in der alle Details, die auf dem Bildschirm angezeigt werden sollen, in einer einzigen Zeile zusammengefasst sind (auch bekannt als OLAP). Wir können dann Abfragen direkt gegen diese Tabelle ausführen, wodurch die Kosten für das Laden einer komplexen Entität, die viel mehr Informationen enthält, als unser Bildschirm benötigt, umgangen werden.

0voto

Craig Stuntz Punkte 124703

Ich verwende LINQ, um Domänenobjekte auf Ansichtsmodelle abzubilden. (Ich verwende das Entity Framework, aber die Technik funktioniert in jedem ORM mit guter LINQ-Unterstützung). Schreiben Sie zunächst ein POCO-Ansichtsmodell und projizieren Sie dann darauf:

var pm = from c in Context.Cities
         let score = c.Scores.Where(s => s.MonthCode == selectedMonthCode).FirstOrDefault()
         select new CityScoresPresentation
         {
             City = c.Name,
             Score = score.Score
         };

Dies ist LINQ to Entities. LINQ to SQL funktioniert auf ähnliche Weise. YMMV mit anderen ORMs LINQ-Implementierungen.

Ich empfehle dringend die Verwendung eines View-Modells anstelle der Bindung von Views an ORM-fähige Typen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X