2010-06-13 1209 views
6

Tôi có một hệ thống phân cấp khá sâu đối tượng mà tôi đang cố gắng tồn tại với Entity Framework 4, POCO, PI (Persistence Ignorance) và Code First. Đột nhiên mọi thứ bắt đầu hoạt động khá tốt khi tôi thấy tôi không sử dụng toán tử new(). Như đã được viết ban đầu, các đối tượng thường sử dụng new() để tạo các đối tượng con.Entity Framework 4 Code Đầu tiên và toán tử mới()

Thay vào đó, tôi sử dụng tính năng lấy mẫu trên Kho lưu trữ để tạo tất cả các đối tượng con khi cần thiết. Ví dụ, đưa ra:

class Adam 
{ 
    List<Child> children; 
    void AddChildGivenInput(string input) { children.Add(new Child(...)); } 
} 

class Child 
{ 
    List<GrandChild> grandchildren; 
    void AddGrandChildGivenInput(string input) { grandchildren.Add(new GrandChild(...)); } 
} 

class GrandChild 
{ 
} 

("GivenInput" ngụ ý một số chế biến không được hiển thị ở đây)

tôi xác định một AdamRepository như:

class AdamRepository 
{ 
    Adam Add() 
    { 
     return objectContext.Create<Adam>(); 
    } 
    Child AddChildGivenInput(Adam adam, string input) 
    { 
     return adam.children.Add(new Child(...)); 
    } 
    GrandChild AddGrandchildGivenInput(Child child, string input) 
    { 
     return child.grandchildren.Add(new GrandChild(...)); 
    } 
} 

Bây giờ, công trình này cũng đủ. Tuy nhiên, tôi không còn "không biết gì" về cơ chế kiên trì của mình vì tôi đã bỏ qua toán tử new().

Ngoài ra, tôi có nguy cơ bị anemic domain model vì quá nhiều logic kết thúc trong kho lưu trữ thay vì trong các đối tượng miền.

Sau nhiều adieu, một câu hỏi:

Hay đúng hơn là một số câu hỏi ...

  • Liệu mô hình này cần thiết để làm việc với EF 4 Mã đầu tiên?
  • Có cách nào để giữ lại việc sử dụng mới() và vẫn làm việc với EF 4/POCO/Code First không?
  • Có mẫu nào khác có thể để lại logic trong đối tượng miền và vẫn hoạt động với EF 4/POCO/Code First không?
  • Hạn chế này có được dỡ bỏ trong các phiên bản sau của hỗ trợ Code First không?

Đôi khi cố gắng đi theo POCO/ Persistence đường Dốt nát cảm thấy như bơi ngược dòng, lần khác nó cảm thấy như bơi lên Thác Niagara. Tuy nhiên, tôi muốn tin ...

Trả lời

4

Dưới đây là một vài điểm mà có thể giúp trả lời câu hỏi của bạn:

Trong lớp học của bạn, bạn có một trường cho bộ sưu tập cho trẻ em và phương pháp để thêm vào trẻ em . EF nói chung (không chỉ là Code First) hiện yêu cầu các bộ sưu tập là bề mặt như các thuộc tính, do đó, mẫu này hiện không được hỗ trợ. Sự linh hoạt hơn trong cách chúng ta tương tác với các lớp học là một yêu cầu chung cho EF và nhóm của chúng tôi đang xem xét cách chúng tôi có thể hỗ trợ điều này tại thời điểm

Bạn đã đề cập rõ ràng các thực thể có ngữ cảnh. trường hợp. Trong ví dụ sau nếu GetAdam() trả về một đối tượng Adam được gắn vào ngữ cảnh cơ bản thì Cain con mới sẽ được tự động phát hiện bởi EF khi bạn lưu và chèn vào cơ sở dữ liệu.

var adam = myAdamRepository.GetAdam();

var cain = new Child();

adam.Children.Thêm (cain);

~ Rowan

+0

Chào mừng bạn đến với Stack Overflow. Vấn đề cơ bản là tôi thực sự có một hệ thống phân cấp đối tượng sâu, trong đó mỗi cấp đều biết cách tạo ra các thể hiện của các đối tượng của cấp độ tiếp theo. Sự hiểu biết và kinh nghiệm của tôi là tôi sẽ phải tự đi bộ phân cấp đối tượng của mình để đính kèm tất cả các đối tượng riêng lẻ vào một ObjectContext trước khi chúng có thể được duy trì. Ứng dụng của tôi khá phức tạp nhưng tôi sẽ cố gắng và chưng cất nó xuống một ví dụ đơn giản, đầy đủ. Sẽ không xảy ra hôm nay, hy vọng ngày mai. –

+1

@Eric J, đó không phải là những gì tôi hiểu được bởi câu trả lời của Rowan. Đối với tôi, có vẻ như "Nếu bạn thêm thứ gì đó vào bộ sưu tập công cộng của các đối tượng liên quan, thì EF sẽ tự động lưu trữ thực thể đó ngay cả khi bạn chưa thêm nó vào ObjectContext". Điều này phù hợp với hành vi của LINQ to SQL. –