2011-12-22 35 views
5

Tôi tò mò về thực tiễn tốt nhất khi phát triển ứng dụng n-tier với dịch vụ LINQ-to-SQL và WCF.Dịch vụ LINQ-to-SQL và WCF - đối tượng chuyển dữ liệu

Cụ thể, tôi quan tâm, ví dụ: cách quay lại dữ liệu cấp bản trình bày từ hai bảng có liên quan. Giả sử tình huống tiếp theo (nhiều đơn giản):

Cơ sở dữ liệu có bảng:

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

tầng Trung có phương pháp CRUD cho OrderDetails. Vì vậy, tôi cần phải có cách để xây dựng lại thực thể để gắn vào bối cảnh để cập nhật hoặc chèn khi nó trở lại từ lớp trình bày.

Trong lớp trình bày, tôi cần hiển thị danh sách OrderDetails tương ứng OrderName từ bảng chính.

Có hai cách tiếp cận cho các lớp học, mà trở về từ các dịch vụ:

  1. Sử dụng DTO lớp tùy chỉnh mà sẽ đóng gói dữ liệu từ hai bảng và chiếu:

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

    Nhược điểm: cần phải gán mọi trường quan trọng đối với lớp trình bày theo cả hai cách (khi trả lại dữ liệu và khi tạo đối tượng mới để gắn vào ngữ cảnh, khi dữ liệu trở lại từ lớp trình bày)

  2. Sử dụng tùy chỉnh LINQ-to-SQL thực thể một phần lớp:

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

Nhược điểm: truy vấn cơ sở dữ liệu sẽ bao gồm tất cả các cột từ Orders bảng, LINQ-to-SQL sẽ thực hóa toàn bộ thực thể Order, mặc dù tôi chỉ cần một trường từ nó.

Xin lỗi vì câu chuyện dài như vậy. Tôi có thể bỏ lỡ điều gì đó không? Sẽ đánh giá cao bất kỳ đề xuất nào.

Trả lời

3

Tôi có thể nói sử dụng DTO và Automapper, không phải là một ý tưởng tốt để lộ DB thực thể như DataContract

+0

Hoặc EmitMapper, họ nói rằng nó có hiệu suất tốt hơn nhiều. – Monsignor

+0

Tại sao không phải EF? Rất thú vị –

1

là sử dụng LINQ to SQL một yêu cầu cho bạn hoặc bạn vẫn đang trong giai đoạn thiết kế, nơi bạn có thể chọn công nghệ? Nếu mới nhất, tôi sẽ đề nghị sử dụng Entity Framework với Self Tracking Entities (STE). Hơn khi bạn nhận được thực thể trở lại từ khách hàng, tất cả các thay đổi của khách hàng sẽ được xử lý cho bạn một cách tự động bởi STEs, bạn sẽ phải gọi Save. Bao gồm các thực thể liên quan cũng dễ dàng như sau: (...some query...).Orders.Include(c => c.OrderDetails)

+0

Thật không may tôi đang trong giai đoạn phát triển. Tôi đã suy nghĩ về việc di cư đến EF, nhưng nó không phải là một sự lựa chọn cho một thời điểm do giới hạn thời gian. – Harm

Các vấn đề liên quan