2011-10-03 24 views
10

Tôi tự hỏi liệu có khả năng mong muốn tải các thực thể liên quan đến một lớp con nhất định của lớp đã cho hay không.Entity Framework - Đang tải các đối tượng liên quan đến lớp con

Cấu trúc lớp học bên dưới

Thứ tự có liên quan đến nhiều lớp con cơ sở (SuborderBase). Lớp MySubOrder kế thừa từ SuborderBase. Tôi muốn chỉ định đường dẫn cho Include() để tải các thực thể liên quan đến MySubOrder (Customer) khi tải Order, nhưng tôi đã nhận được một lỗi khi tuyên bố rằng không có mối quan hệ nào giữa SuborderBase và Customer. Nhưng mối quan hệ tồn tại giữa MySubOrder và khách hàng.

Dưới đây là truy vấn mà không

Context.Orders.Include("SubOrderBases").Include("SubOrderBases.Customers") 

Làm thế nào tôi có thể xác định một cách rõ ràng rằng?

Cập nhật. kế hoạch tổ chức dưới enter image description here

+1

Có lẽ không có giải pháp với tải mong muốn. Đây là giải pháp thay thế với phép chiếu (chỉ đoạn mã thứ ba trong câu trả lời được chấp nhận hoạt động, không phải đoạn thứ hai, xem nhận xét cho câu trả lời): http://stackoverflow.com/questions/6586574/bottleneck-using-entity-framework- di sản. Ở đây (http://stackoverflow.com/questions/7203303/how-do-i-deeply-eager-load-an-entity-with-a-reference-to-an-instance-of-a-persist) là một câu hỏi tương tự không có câu trả lời nào cả. – Slauma

+0

Bạn có thể phác thảo các lớp và các mối quan hệ một thời gian ngắn trong mã ('Order',' SubOrderBase', 'MySubOrder',' Customer') không? Nhìn vào câu trả lời, mọi người dường như hiểu nhầm câu hỏi của bạn. Tôi nhận được không chắc chắn là bây giờ sau khi câu trả lời đầu tiên và ý kiến. – Slauma

+0

Đã thêm hình ảnh với sơ đồ lớp – Gopher

Trả lời

13

Đây là một giải pháp mà chỉ yêu cầu một đơn roundtrip:

var orders = Context.Orders 
    .Select(o => new 
    { 
     Order = o, 
     SubOrderBases = o.SubOrderBases.Where(s => !(s is MyOrder)), 
     MyOrdersWithCustomers = o.SubOrderBases.OfType<MyOrder>() 
      .Select(m => new 
      { 
       MyOrder = m, 
       Customers = m.Customers 
      }) 
    }) 
    .ToList() // <- query is executed here, the rest happens in memory 
    .Select(a => 
    { 
     a.Order.SubOrderBases = new List<SubOrderBase>(
      a.SubOrderBases.Concat(
      a.MyOrdersWithCustomers.Select(m => 
       { 
        m.MyOrder.Customers = m.Customers; 
        return m.MyOrder; 
       }))); 
     return a.Order; 
    }) 
    .ToList(); 

Về cơ bản, nó là một phép chiếu thành một bộ sưu tập kiểu ẩn danh. Sau đó kết quả truy vấn được chuyển thành các thực thể và các thuộc tính dẫn hướng trong bộ nhớ. (Nó cũng hoạt động với theo dõi bị vô hiệu hóa.)

Nếu bạn không cần thực thể, bạn có thể bỏ qua toàn bộ phần sau ToList() đầu tiên và làm việc trực tiếp với kết quả trong các đối tượng ẩn danh.

Nếu bạn phải sửa đổi biểu đồ đối tượng này và cần theo dõi thay đổi, tôi không chắc liệu phương pháp này có an toàn hay không vì thuộc tính điều hướng không được đặt hoàn toàn khi dữ liệu được tải - ví dụ MyOrder.Customersnull sau khi chiếu và sau đó cài đặt thuộc tính mối quan hệ trong bộ nhớ có thể được phát hiện như là một sửa đổi mà nó không phải là và gây rắc rối khi bạn gọi SaveChanges.

Phép chiếu được thực hiện cho các tình huống chỉ đọc, không phải để sửa đổi. Nếu bạn cần thay đổi theo dõi cách an toàn hơn có thể là tải các thực thể đầy đủ trong nhiều vòng tròn vì không có cách nào để sử dụng Include trong một vòng đơn để tải toàn bộ biểu đồ đối tượng trong tình huống của bạn.

+0

Cảm ơn! giải pháp rất thú vị!Không chính xác những gì tôi muốn, nhưng tôi nghĩ rằng ví dụ này sẽ là một nguồn cảm hứng tuyệt vời – Gopher

+9

Câu trả lời tuyệt vời nhưng những gì một cách đáng kể daft của việc phải làm việc. Bất cứ ai cũng nghĩ rằng nhóm EF bỏ qua thực tế là các cơ sở dữ liệu quan hệ có mối quan hệ giữa các bảng. –

0

Giả sử u nạp danh sách đơn đặt hàng như lstOrders, hãy thử này:

foreach (Orders order in lstOrders) 
    order.SubOrderBases.Load(); 

và tương tự cho khách hàng ..

+2

có, nhưng tôi đang nghĩ cách thực hiện điều này với truy vấn 1 sql .. – Gopher

+2

thử cách này: Context.Orders.Include ("SubOrderBases"). Bao gồm ("Khách hàng") – Boomer

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