2012-06-15 31 views
13

Làm cách nào để chúng tôi có thể thông báo cho Entity Framework về Aggregates?Hỗ trợ gốc tổng hợp trong khung thực thể

  1. khi lưu một tổng hợp, tiết kiệm các đơn vị trong tổng
  2. khi xóa một số tổng hợp, xóa đơn vị trong tổng
  3. nâng cao một lỗi đồng thời khi hai người dùng khác nhau cố gắng để sửa đổi hai thực thể khác nhau trong aggreate cùng
  4. khi tải một tổng hợp, cung cấp một cái nhìn point-in-time phù hợp của tổng thậm chí nếu có một số thời gian trễ trước khi chúng ta truy cập vào tất cả các đơn vị trong tổng

(Entity Framework 4.3.1 Mã đầu tiên)

+1

Điều bạn muốn là Sourcing Event http://cqrs.wordpress.com/documents/events-as-storage-mechanism/. EF là khá nhiều vô dụng ở đây, chỉ cần một chi phí đắt tiền – MikeSW

+0

Cảm ơn. Thật không may, chúng tôi không ở trong một môi trường chấp nhận tìm nguồn cung ứng sự kiện. –

+1

Sau hai năm sử dụng EF trong ứng dụng Domain Driven Design: EF được gọi là "Entity Framework" chứ không phải "General Root Framework" vì một lý do. –

Trả lời

6

EF cung cấp tính năng cho phép bạn xác định uẩn của bạn và sử dụng chúng:

  1. Đây là phần đau đớn nhất. EF làm việc với các biểu đồ thực thể. Nếu bạn có một thực thể như Invoice và thực thể này có tập hợp các thực thể InvoiceLine có liên quan, bạn có thể tiếp cận nó như tổng hợp. Nếu bạn đang ở trong kịch bản đính kèm, mọi thứ hoạt động như mong đợi nhưng trong kịch bản tách rời (hoặc tổng hợp không được nạp bởi EF hoặc nó được nạp bởi cá thể ngữ cảnh khác nhau), bạn phải đính kèm tập hợp vào thể hiện ngữ cảnh và cho biết chính xác bạn đã thay đổi gì = cho mọi thực thể và liên kết độc lập trong biểu đồ đối tượng.
  2. Điều này được xử lý bằng cách xóa tầng - nếu bạn có các thực thể liên quan được tải, EF sẽ xóa chúng nhưng nếu bạn không phải xóa tầng được cấu hình trên quan hệ trong cơ sở dữ liệu.
  3. Điều này được xử lý bằng mã thông báo đồng thời trong cơ sở dữ liệu - thường là cột dấu thời gian hoặc cột hàng tuần nhất.
  4. Bạn phải sử dụng tính năng tải nhanh và tải tất cả dữ liệu vào đầu (= điểm nhất quán) hoặc bạn sẽ sử dụng tải chậm và trong trường hợp này bạn sẽ không có điểm nhất quán vì tải chậm sẽ tải trạng thái hiện tại của quan hệ nhưng nó sẽ không cập nhật các phần khác của tổng hợp mà bạn đã tải (và tôi coi đây là sát thủ hiệu suất nếu bạn cố gắng thực hiện như vậy làm mới với EF).
+0

# 3 - EF có phát hiện xung đột khi hai người dùng sửa đổi các InvoiceLines khác nhau trên cùng một hóa đơn không? # 4 - tải lên mong muốn bằng cách sử dụng .Bao gồm() trên mỗi truy vấn là đau đớn và dễ bị lỗi –

+0

# 3 trong trường hợp này, bạn sẽ phải đảm bảo rằng thay đổi 'InvoiceLine' sẽ đặt' Hoá đơn' thành trạng thái sửa đổi và cập nhật hóa đơn sẽ là được thực hiện. –

+0

# 4 háo hức tải là có thể đau đớn trong thời gian mã hóa nhưng nó là rõ ràng và nó cho thấy những gì thực sự xảy ra. Bạn có thể đồng bộ hóa lại mã của bạn để sử dụng cơ sở truy vấn chung nơi tải mong muốn sẽ được xác định. Đạt được quan điểm nhất quán với tải chậm đòi hỏi phải tuân thủ tất cả các dữ liệu được tải từ tổng hợp. Tải kém có thể xấu nhưng điều này sẽ cực kỳ tệ. –

6

Tôi đã viết GraphDiff dành riêng cho mục đích này. Nó cho phép bạn xác định 'ranh giới tổng hợp' trên bản cập nhật bằng cách cung cấp ánh xạ thông thạo. Tôi đã sử dụng nó trong trường hợp tôi cần phải vượt qua các biểu đồ thực thể tách rời qua lại.

Ví dụ:

// Update method of repository 
public void Update(Order order) 
{ 
    context.UpdateGraph(order, map => map 
     .OwnedCollection(p => p.OrderItems); 
} 

Trên đây sẽ nói với khung Entity để cập nhật các đối tượng theo thứ tự và cũng kết hợp các bộ sưu tập của OrderItems. Ánh xạ trong thời trang này cho phép chúng tôi đảm bảo rằng Khung thực thể chỉ quản lý biểu đồ trong giới hạn mà chúng tôi xác định trên tổng hợp và bỏ qua tất cả các thuộc tính khác. Nó hỗ trợ kiểm tra đồng thời lạc quan của tất cả các thực thể. Nó xử lý các kịch bản phức tạp hơn nhiều và cũng có thể xử lý các tham chiếu cập nhật trong nhiều kịch bản (thông qua AssociatedCollections).

Hy vọng điều này có thể được sử dụng.

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