2011-12-22 7 views
5

Ciekawi mnie dobra praktyka przy tworzeniu aplikacji n-warstwowych z usługą Linq-SQL i WCF.Usługa Linq-to-SQL i WCF - obiekty przesyłania danych

W szczególności, jestem zainteresowany, na przykład, jak powrócić do danych poziomu prezentacji z dwóch powiązanych tabel. Załóżmy, że następny sytuacji (znacznie uproszczony):

Database tabele:

  • Orders (id, OrderName)
  • OrderDetails (id, orderid, DetailName)

warstwa środkowa posiada metody CRUD dla OrderDetails. Potrzebuję więc sposobu na odbudowanie encji w celu dołączenia do kontekstu aktualizacji lub wstawienia po powrocie z warstwy prezentacji.

W warstwie prezentacji potrzebuję wyświetlić listę OrderDetails z odpowiadającą OrderName z tabeli nadrzędnej.

Istnieją dwa podejścia do zajęć, który powrócił ze służby:

  1. Zastosowanie DTO niestandardowej klasy, które będą symbolizować dane z obu tabel i projekcji:

    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(); 
    } 
    

    Wady: konieczność przypisania każde pole, które jest ważne dla warstwy prezentacji w obie strony (podczas zwracania danych i podczas tworzenia nowego obiektu do dołączania do kontekstu, gdy dane wracają z warstwy prezentacji)

  2. Użyj własnego LINQ-SQL podmiot częściowe klasa:

    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(); 
    } 
    

Wady: zapytanie do bazy danych będzie zawierać wszystkie kolumny z Orders stołowy, LINQ-to-SQL zmaterializuje całą jednostkę porządku, chociaż potrzebujesz tylko jednego pola.

Przepraszam za tak długą historię. Czy mogę coś przeoczyć? Doceni wszelkie sugestie.

Odpowiedz

3

powiedziałbym użytkowania dto i Automapper, nie jest dobrym pomysłem, aby odsłonić podmiot DB jako DataContract

+0

Albo EmitMapper, mówią, że ma znacznie lepszą wydajność. – Monsignor

+0

Dlaczego nie EF? Bardzo interesujące –

1

Czy korzystanie z LINQ do SQL wymóg dla Ciebie lub jesteś jeszcze w fazie projektowania, gdzie można wybrać technologie? Jeśli ostatnio, sugerowałbym użycie Entity Framework z Self Tracking Entities (STE). Następnie, gdy otrzymasz obiekt od klienta, wszystkie zmiany klienta będą obsługiwane automatycznie przez STE, wystarczy zadzwonić Zapisz. Także podmioty powiązane są łatwe: (...some query...).Orders.Include(c => c.OrderDetails)

+0

Niestety jestem w fazie rozwoju. Myślałem o migracji do EF, ale to nie jest wybór na chwilę ze względu na limit czasu. – Harm