2013-02-05 19 views
10

Tôi đang sử dụng khung thực thể 5 với phương pháp mã đầu tiên và sử dụng cấu hình API thông thạo cho thực thể. Dự án của tôi có một thực thể sản phẩm cụ thể lấy một nửa dữ liệu từ cơ sở dữ liệu và một nửa khác từ một hợp đồng dữ liệu được truy xuất thông qua WCF Client (hệ thống bên thứ 3 được sử dụng để quản lý khoảng không quảng cáo sản phẩm). Hợp đồng dữ liệu là thành viên của lớp Product Entity (thuộc tính hoặc phương thức mà tôi chưa quyết định).Khuôn khổ thực thể 5 - Tìm kiếm điểm trung tâm để thực thi mã tùy chỉnh sau khi thực thể được tải từ cơ sở dữ liệu

Tôi không muốn có bất kỳ logic WCF Client nào chứa trong thực thể. Tôi muốn giữ logic này trong mã Repository (DbContext, DbSet, v.v.).

Vì vậy, có một kỹ thuật để móc vào Entity Framework (hoặc chặn) ngay sau khi một thực thể sản phẩm được lấy ra từ cơ sở dữ liệu? Tôi nên lưu ý Product Entity xuất hiện dưới dạng thuộc tính điều hướng trên các thực thể khác. Nếu một móc hoặc đánh chặn là có thể thì điều đó có nghĩa là tôi có thể lấy hợp đồng dữ liệu từ dịch vụ SOAP ngay sau khi EF nạp Product Entity từ cơ sở dữ liệu. Lợi ích cho dự án của tôi là mã truy xuất WCF Client không cần lặp lại trong suốt ứng dụng.

Một ý tưởng tôi có là triển khai IDbSet cho Hợp đồng dữ liệu và IDbSet sẽ chịu trách nhiệm truy xuất nó. Và sau đó bằng cách nào đó lừa EF nghĩ rằng nó là tài sản điều hướng trên thực thể sản phẩm. Nhưng tôi đã không chắc chắn nếu một cơ sở dữ liệu DbSet có thể được trộn lẫn với một IDBSet phi cơ sở dữ liệu tất cả trong cùng một DbContext. Và cũng là câu hỏi khác - làm sao mà EF biết để lấy ra một tài sản điều hướng từ việc cấy ghép IDbSet? Tôi muốn biết ý tưởng này có khả thi hay không trước khi đầu tư thời gian vào nó. Tôi cũng muốn biết bắt đầu từ đâu.

Xin lưu ý rằng tôi đã làm việc với .NET trong hơn 10 năm nhưng nội dung EF5 này vẫn còn tương đối mới đối với tôi.

Xin cảm ơn trước.

-Sam

Trả lời

17

Hôm nay tôi tìm thấy sự kiện trong Khuôn khổ thực thể dường như là những gì tôi đang tìm kiếm. ObjectContext.ObjectMaterialized Event. DbContext thực hiện IObjectContextAdapter mà trong đó lần lượt cho thấy ObjectContext. Từ đó tôi có thể đăng ký sự kiện ObjectMaterialized.

MSDN Đọc: Xảy ra khi một đối tượng thực thể mới được tạo ra từ dữ liệu trong các dữ liệu nguồn như một phần của hoạt động truy vấn hoặc tải.

Mã sau đây minh họa cách tôi đã sử dụng sự kiện ObjectMaterialized để giải quyết vấn đề của mình trong đó một trong các tùy chọn của tôi là có điểm trung tâm để đặt logic truy cập máy khách WCF.

// seperate assembly - does not use Domain.Repositories assembly 
namespace Domain.Models 
{ 
    // the data contract 
    [DataContract] 
    public class ProductInventoryState 
    { 
     [DataMember] 
     public int StockStatus { get; set; } 

     [DataMember] 
     public IEnumerable<String> SerialNumbers { get; set; } 

     // etc.... 
    } 

    // the entity 
    public class Product 
    { 
     public Guid Key { get; set; } 
     public string ProductCode { get; set; } 
     public ProductInventoryState InventoryState { get; set; } 
     // etc.... 
    } 
} 

// seperate assembly - uses Domain.Models assembly 
namespace Domain.Repositories 
{ 
    public class MainRepository : DbContext 
    { 
     public MainRepository() 
     { 
      ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += ObjectContext_ObjectMaterialized; 
     } 

     protected void ObjectContext_ObjectMaterialized(object sender, ObjectMaterializedEventArgs e) 
     { 
      if (e.Entity == null) 
       return; 

      if (e.Entity is Product) 
      { 
       Product product = (Product)e.Entity; 

       // retrieve ProductInventoryState from 3rd party SOAP API 
       using (ThirdPartyInventorySystemClient client = new ThirdPartyInventorySystemClient()) 
       { 
        // use ProductCode to retrieve the data contract 
        product.InventoryState = client.GetInventoryState(product.ProductCode); 
       } 
      } 
     }  
    } 
} 
+0

có, sự kiện đó cũng có ở đó là SavingChanges. Nhưng một FYI nhanh chóng: nếu sử dụng các dự báo, chúng sẽ không kết thúc trong Bối cảnh. Cũng có thể truy vấn với các MergeOptions khác nhau. Vì vậy, hãy lưu ý không phải tất cả các cuộc gọi EF đều dẫn đến một đối tượng đầy đủ được đặt/sáp nhập trong ObjectContext. –

+0

Cho đến nay giải pháp của tôi đang làm việc cho tôi ... cho đến nay. Đúng vậy - cho dự đoán một thực thể không được tái tạo vì nó không phải là một sự thương mại trong trường hợp của tôi vì mã máy khách sẽ chỉ muốn tham chiếu đến một thực thể sản phẩm. Đối với các ảnh hưởng MergeOptions có trên một truy vấn, nó có ý nghĩa. Tôi sẽ phải tìm ra rằng đầu tiên tay để xem nếu MergeOptions trình bày một vấn đề. Hãy theo dõi ... Tôi sẽ cập nhật chủ đề này trên đó. –

1

1.) Bạn có thể viết Provider EF của riêng bạn (nhưng đó là nhiệm vụ không nhỏ)

2.) Bạn có thể đính kèm các mặt hàng với bối cảnh nhưng không cứu họ.

Thực thể.State có thể được đặt là Không được sửa đổi sau khi đính kèm. Bạn cũng có thể xóa các mục nhập đó khỏi Ngữ cảnh trước khi lưu thay đổi

3) Bạn có thể viết một kho lưu trữ kiểm tra EF và Kiểm tra vị trí 2 và kết hợp kết quả.

Về câu hỏi của thuộc tính điều hướng. Bạn sẽ cần phải xác định những điều này rất cẩn thận để tránh các vấn đề. Không lười biếng tải hoặc thậm chí không được mô hình hoá.

Tôi sẽ không thử và kết hợp chúng một cách cá nhân.
Bạn có thể yêu cầu EF bỏ qua một số thuộc tính. Vì vậy, bạn có thể có một POCO ban đầu của Nice, nhưng chỉ mô hình hóa các bit trên DB.

POCO sau đó sẽ thu thập phần còn lại.

Tôi sử dụng một trò chơi với các sự kiện để thực hiện các phương pháp KEY trên ngữ cảnh/DBset. Vì vậy, tôi có thể kích hoạt các sự kiện khi đính kèm, nhận, lưu, v.v.

chúc may mắn

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