Linq-to-SQL und WCF-service - Daten-Objekte übertragen
Ich bin neugierig auf best practice bei der Entwicklung von n-tier-Anwendung mit Linq-to-SQL und WCF-Dienst.
Insbesondere bin ich interessiert, zum Beispiel, wie man zurückkehren zu Präsentation tier-Daten aus zwei verknüpften Tabellen. Nehme an, nächste situation (stark vereinfacht):
Datenbank hat Tabellen:
Orders
(id, OrderName
)OrderDetails
(id, orderid, DetailName
)
Middle tier hat CRUD-Methoden für OrderDetails
. So, ich muss Methode zur Wiederherstellung der Einheit zur Befestigung an den Rahmen für update-oder insert-wenn es wieder aus der Präsentations-Schicht.
In der presentation layer muss ich anzeigen Liste der OrderDetails
mit entsprechenden OrderName
aus der übergeordneten Tabelle.
Gibt es zwei Ansatz für Klassen, die vom Dienst zurückgegebenen:
-
Verwenden DTO benutzerdefinierte Klasse, die werde einkapseln von Daten aus beiden Tabellen und Projektion:
class OrderDetailDTO { public int Id { get; set; } public string DetailName { get; set; } public string OrderName { get; set; } } IEnumerable<OrderDetailDTO> GetOrderDetails() { var db = new LinqDataContext(); return (from od in db.OrderDetails select new OrderDetailDTO { Id = od.id, DetailName = od.DetailName, OrderName = od.Order.OrderName }).ToList(); }
Nachteile: zuweisen müssen jeder Feld ist wichtig für den presentation layer in beide Richtungen (beim zurückgeben von Daten und bei der Erstellung von neuen Unternehmen für die Befestigung an Rahmen, wenn die Daten wieder aus der presentation layer)
-
Verwenden Sie benutzerdefinierte Linq-to-SQL, entity partielle Klasse:
partial class OrderDetail { [DataMember] public string OrderName { get { return this.Order.OrderName //return value from related entity } set {} } } IEnumerable<OrderDetail> GetOrderDetails() { var db = new LinqDataContext(); var loadOptions = new DataLoadOptions(); loadOptions.LoadWith<OrderDetail>(item => item.Order); db.LoadOptions = options; return (from od in db.OrderDetails select od).ToList(); }
Nachteile: Datenbank-Abfrage alle Spalten aus Orders
Tabelle, Linq-to-SQL realisiert ganze Order-Entität, obwohl ich brauche nur ein Feld von es.
Sorry für diese lange Geschichte. Kann sein das ich etwas verpasst? Schätzen Anregungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde sagen, verwenden DTO und Automapper, nicht eine gute Idee zu setzen-DB-Einheit als datacontract
Ist die Verwendung von Linq to SQL eine Voraussetzung für Sie, oder Sie sind noch in der design Phase, wo Sie wählen können Technologien? Wenn die Letzte, ich würde vorschlagen, mit Entity Framework mit Self-Tracking-Entities (STE). Als wenn man entity zurück, von client alle änderungen durch den Kunden bearbeitet werden, werden Sie automatisch durch STEs, Sie müssen nur anrufen Speichern. Einschließlich der damit verbundenen Personen ist auch leicht, dann:
(...some query...).Orders.Include(c => c.OrderDetails)