2009-09-03 35 views
10

Câu hỏi của tôi có lẽ rất đơn giản, làm thế nào để bạn tải trẻ em/lớp con. Không có "tải" hoặc bất cứ thứ gì giống như nó mà tôi có thể tìm thấy để tải ngữ cảnh cho trẻ em.Khuôn khổ thực thể 3.5 - Cách tải trẻ em

lớp bối cảnh là loại ObjectContext, xem dưới đây:

public partial class RTIPricingEntities : global::System.Data.Objects.ObjectContext 

sản phẩm

Product.ModifiedByUser (làm thế nào để nạp lớp này, khi tải sản phẩm ??)

sản phẩm .Thể loại (cách tải danh mục khi tải sản phẩm?)

+0

Dưới đây là ví dụ về cách Im tải dữ liệu: Có lẽ tôi nên đề cập rằng tôi đang mã hóa ứng dụng này cho ứng dụng Silverlight. Và điều này là thông qua một dịch vụ miền. RTIPricingContext _context = new RTIPricingContext(); LoadOperation op = _context.Load (context.GetPurchaseOrderQuery(), PurchaseOrdersLoadedCallback, null); khoảng trống riêng PurchaseOrdersLoadedCallback (LoadOperation lo) { IEnumerable po = lo.Entities.Where (w => w.UserID == SelectedUser.ID); // Đây là bộ sưu tập mà tôi cần đưa vào các lớp con. – Jukeman

Trả lời

16

Bạn có thể tải háo hức:

var q = from p in Context.Products 
        .Include("ModifiedByUser") 
        .Include("Category") 
     select p; 

... hoặc dự án:

var q = from p in Context.Products 
     select new 
     { 
      Id = p.Id, 
      Name = p.Name 
      ModifiedByUserName = p.ModifiedByUser.Name, 
      CategoryName = p.Category.Name 
     } 

Ưu điểm của dự báo là bạn chỉ nhận được dữ liệu bạn cần, không phải là toàn bộ của tất cả các thực thể tham chiếu. Lợi thế của tải háo hức là các thực thể trả lại thực hiện theo dõi thay đổi. Chọn kỹ thuật phù hợp cho vấn đề trong tầm tay.

Cập nhật

Vâng, nó quan trọng để đề cập rằng bạn đang sử dụng RIA Services. Tôi đoán bạn cũng đang làm việc trong khách hàng. Điều này làm cho mọi thứ hoàn toàn khác nhau.

Trong các Dịch vụ RIA, điều quan trọng là phải đảm bảo rằng bạn trả về toàn bộ biểu đồ của các thực thể bạn yêu cầu trong lần tải đầu tiên. Bạn không muốn gọi bất cứ thứ gì như .Load() trên một thực thể, bởi vì đó sẽ là một cái nóng khác đối với máy chủ, điều đó không tốt cho hiệu suất. Nếu bạn đang ở trong, ví dụ, một khách hàng Silverlight và yêu cầu một danh sách các cá thể từ máy chủ và các thuộc tính liên quan của chúng chưa được thực hiện, nó đã quá muộn. Ngoài ra, Bao gồm sẽ không hoạt động trong một khách hàng Silverlight. Do đó, RIA Services có các công cụ phía máy chủ mà bạn có thể sử dụng để đảm bảo rằng bạn trả về đồ thị đối tượng chính xác, đầy đủ vật chất ban đầu.

Những gì bạn cần làm thay vào đó được sử dụng IncludeAttribute bên trong máy chủ Dịch vụ RIA của bạn. Bạn có thể tạo lớp siêu dữ liệu "bạn thân" để trang trí mô hình tổ chức của mình với [Bao gồm]. Có các ví dụ trong the RIA Services overview document, section 4.8.

+0

Xin chào, Tôi không biết nếu chúng tôi có cùng một phiên bản, nhưng không có tùy chọn nào có thể khi im mã hóa nó. Không có ". Bao gồm" có sẵn, chỉ "Intersect" .. im bằng cách sử dụng entityframework có nguồn gốc thực thể có "ObjectContext" như lớp cơ sở của nó .. Và khi tôi dự án, không có tài sản trong intellisense cho tôi để thiết lập .. – Jukeman

+1

Bao gồm là một phương thức của ObjectQuery , không phải IQueryable . Vì vậy, hãy kiểm tra loại tham chiếu bạn có. Các thực thể không lấy được từ ObjectContext, chúng lấy được từ EntityObject. Trong ví dụ của tôi sẽ không có bất kỳ IntelliSense nào trên đối tượng được chiếu vì tôi đã sử dụng một loại * nặc danh *. Nếu tôi đã sử dụng một loại không ẩn danh thì sẽ có IntelliSense. –

3

Bạn có thể sử dụng phương thức Include() của System.Data.Objects.ObjectQuery. Phương thức này xác định các đối tượng liên quan để bao gồm trong các kết quả truy vấn và các cuộc gọi đến Include() có thể được ghép lại với nhau để tải nhiều đối tượng liên quan.

Ví dụ để tải ModifiedByUser và loại bạn sẽ sử dụng một truy vấn như thế này:

var q = from p in context.Products.Include("ModifiedByUser").Include("Category") 
     select p; 

Nếu pháp nhân loại của bạn cũng đã có một thực thể ModifiedByUser mà bạn muốn tải bạn sẽ sử dụng một truy vấn như thế này:

var q = from p in context.Products 
       .Include("ModifiedByUser") 
       .Include("Category.ModifiedByUser") 
     select p; 

Xem Shaping Query Results trên MSDN để biết thêm ví dụ.

+0

Tôi thấy giải pháp này khá một chút, vì vậy tôi phải làm một cái gì đó hoàn toàn khác với tất cả những người khác. Về cơ bản, tôi đang sử dụng ngữ cảnh từ datamodel được tạo bởi entityframework. Tôi có phiên bản mới nhất của .Net. Không có lịch phát sóng "Bao gồm". Bạn đang sử dụng dbml/linq trong ví dụ này?Tôi nghĩ rằng đây là lý do tại sao nó khác nhau ... – Jukeman

7

Sử dụng .Include() như nhiều người khác đã đề xuất là một cách tuyệt vời để đạt được những gì bạn cần.

Tuy nhiên, đôi khi bạn có thể cần phải "tải lại" thứ gì đó mà bạn không "bao gồm" hoặc đôi khi bạn chỉ cần một câu lệnh Bao gồm có thể lãng phí chu kỳ tính toán trong nhiều trường hợp .

Trong trường hợp quan hệ số ít như "Product.Category" (trong đó Product.Category là thuộc tính điều hướng của bạn từ sản phẩm đến danh mục), bạn có nhiều khả năng cũng có phần tử "Product.CategoryReference". Bạn có thể kiểm tra xem nó có được tải hay không và nếu không, bạn có thể tải nó theo yêu cầu:

if(!Product.CategoryReference.IsLoaded) 
{ 
    Product.CategoryReference.Load(); 
} 

Bây giờ, danh mục "được tham chiếu" của bạn nên có trong bộ nhớ và sẵn sàng để sử dụng.

Nếu bạn có một tài sản chuyển hướng mà tham chiếu một bộ sưu tập của sự vật (ví dụ: "Phụ" cho một sản phẩm), bạn có thể làm điều tương tự, trực tiếp trên tài sản chuyển hướng:

if(!Product.Parts.IsLoaded) 
{ 
    Product.Parts.Load(); 
} 

Đó có thể là một kỹ thuật hữu ích cho "tải theo yêu cầu" của các thuộc tính điều hướng kiểu đơn hoặc bộ sưu tập nếu bạn chưa "đưa chúng" vào truy vấn EF của mình.

Marc

+0

Cảm ơn tất cả mọi người, tôi nhận ra rằng lý do tôi không thể thực hiện nhiều giải pháp được đề xuất là vì ngữ cảnh khác khi chuyển đổi bởi dịch vụ miền cho Silverlight. Trong đoạn mã phía sau của mô hình dữ liệu khung thực thể, tôi có thể thực hiện tất cả các giải pháp của bạn và tôi đã tìm ra điều đó. Nhưng nhờ sự giúp đỡ của bạn, tôi biết rằng vấn đề phải là tôi đang nhìn nhầm chỗ ... – Jukeman

0

Tôi đã nhận thấy rằng giải pháp được đề cập ở trên bởi Craig không tải cả ModifiedByUser và Danh mục. Nó chỉ tải bộ sưu tập đối tượng cuối cùng trong trường hợp này là "Danh mục".

var q = from p in Context.Products 
       .Include("ModifiedByUser") 
       .Include("Category") 
    select p; 

Tuy nhiên, nếu bạn thay đổi thứ tự, để làm cho nó .Include("Category").Include("ModifiedByUser"), sau đó ModifiedByUser được tải. Điều đáng sợ là thuộc tính IsLoaded của cả bộ sưu tập đối tượng sẽ hiển thị "true", tuy nhiên Đếm cho bộ sưu tập đối tượng đầu tiên sẽ luôn bằng không. Không chắc chắn tại sao lại như vậy.

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