2010-06-22 51 views
9

Chúng tôi có một trang web ASP.Net MVC2, và đang sử dụng EF4 để truy cập cơ sở dữ liệu, vv Là mới đối với EF4, chúng tôi đã đi qua khái niệm EF4 POCO, tuy nhiên không hoàn toàn hiểu nó.Khi nào POCO nên được sử dụng trong EF4?

Nói chung, tôi đã nghe POCO định nghĩa là đối tượng "không phụ thuộc vào khung bên ngoài". Trong trường hợp của EF4, tôi đoán điều này có nghĩa là POCO sẽ ngụ ý bằng cách nào đó tạo ra các thực thể trọng lượng nhẹ hơn? Nếu đúng như vậy, POCO không có ống nước EF4, những ưu điểm/nhược điểm của điều này, công việc phát triển thêm nào có thể cần với POCO. Tóm lại, khi nào thì tốt khi sử dụng POCO trong EF4?

Trả lời

14

"POCO" là một thuật ngữ mơ hồ trong không gian ORM. Mọi người khác nhau sử dụng nó để có nghĩa là:

  • POCO "tinh khiết", không theo dõi thay đổi, tải chậm, có thuộc tính riêng tư, v.v. Họ có thể gặp khó khăn khi làm việc.
  • proxy Psuedo-POCO: Các loại có mọi thứ public virtual và có các loại khác nhau khi chạy.
  • Thực thể tự theo dõi. Không phải POCO, nhưng cũng không phải là EntityObject.

Tôi thấy định nghĩa "không phụ thuộc vào khuôn khổ bên ngoài" có phần tự phục vụ. Đó là cách bỏ qua những hạn chế của một khung công tác. Tức là, các proxy không phải là POCO thực sự trong cuốn sách của tôi, nhưng chúng đáp ứng được định nghĩa đó.

Có gì sai với EntityObject? Không nhiều. Nó khá nhẹ và là một phần của .NET. Đó là trong hồ sơ khách hàng .NET 4, thậm chí. Nó thậm chí không dây chuyền bạn đến EF. Mặc dù nó sẽ là loại lẻ để sử dụng nó như là một "loại POCO" với một khuôn khổ khác nhau, nó sẽ làm việc tốt. Tuy nhiên, nó không có trong Silverlight, IIRC.

Thực thể POCO khó làm việc hơn, bởi vì bạn mất các nội dung mà EntityObject cung cấp cho bạn miễn phí. Đó không phải là rất nhiều, nhưng một cái gì đó để xem xét trước khi chọn POCOs chỉ vì "họ đang mát mẻ," đặc biệt là cho những người mới đến EF.

Một điều mà rất nhiều người tôn giáo về POCO có xu hướng bỏ qua: Lập bản đồ các loại không thuộc POCO không giới hạn bạn để lộ những loại không thuộc POCO bên ngoài. dịch vụ dữ liệu của bạn có thể dự án lập bản đồ các loại phi POCO vào unmapped POCO DTOs và bạn có thể chọn để chỉ tiếp xúc với những loại, ví dụ:

public IEnumerable<FooDto> IFooRepository.SelectAll() 
{ 
    return from f in Context.Foos 
      select new FooDto { Id = f.Id, Name = f.Name }; 
} 

Vì vậy, các loại bản đồ và các loại dịch vụ dữ liệu có thể dễ dàng được mối quan tâm khác nhau, nếu bạn lựa chọn .

Khi nào bạn hoàn toàn cần không phải EntityObject loại để lập bản đồ? Vâng, nếu bạn cần các thực thể tự theo dõi, thì đó là một trường hợp mở và đóng. Nếu bạn phải phơi bày các loại ánh xạ của mình với Silverlight, thì rõ ràng là sau đó.

Ngoài ra nó không rõ ràng. Nếu bạn đang viết một dịch vụ dữ liệu cho tiêu dùng công cộng, thì bạn không nên tạo các DTO là các loại phụ EntityObject, bởi vì điều đó sẽ đứng trong cách để cắm vào một khung công tác khác sau này. Tôi sẽ không bao giờ tạo ra một giao diện công khai bất biến, phụ thuộc vào bất kỳ một khung công tác nào, ngay cả một khung công cụ có trong .NET. Mặt khác, như tôi đã nói ở trên, bạn có thể phơi bày một loại và ánh xạ một loại khác; không có yêu cầu phơi bày các loại ánh xạ, bao giờ và thường là lý do rất tốt để không phơi bày chúng (có lẽ chúng chứa dữ liệu ngoài công khai).

+0

Tôi muốn thêm rằng tôi đã sử dụng POCO bây giờ chủ yếu chỉ để tôi có thể thêm DataAnnotations vào thuộc tính của mình, điều mà tôi không nghĩ là sẽ khôn ngoan khi làm trong tệp thiết kế EF vì chúng có thể bị nuked khi được cập nhật. Mặc dù có lẽ tôi nên sử dụng chúng trên các Mô hình Xem của mình, nó chỉ dễ dàng hơn cho hầu hết các nhu cầu của tôi để thêm chúng ngay trên POCO. – JasperLamarCrabb

+4

@CannibalCorpse: Các lớp EF là một phần và không cần sửa đổi mã được tạo tự động. Không có vấn đề với việc sử dụng DataAnnotations với EF, bạn chỉ cần sử dụng các lớp siêu dữ liệu. – LukLed

9

Tôi hoàn toàn đồng ý với Craig, POCO là điều khó làm việc hơn.

tôi sẽ thêm nhiều hơn về mục đích của POCO, tôi hy vọng bạn sẽ hiểu khi nào nên sử dụng và khi nào không sử dụng.

Model và Dịch vụ là CORE

Model và dịch vụ là một trong những phần quan trọng nhất của ứng dụng của bạn, nó là một NO-NO-NO để thay đổi, bạn sẽ không thể tránh để mô hình cặp chặt chẽ và dịch vụ với bất kỳ phần nào của ứng dụng của bạn, do đó thay đổi nhỏ của mô hình yêu cầu thay đổi toàn bộ ứng dụng.

Đó là về tính linh hoạt

POCO là một vấn đề của ngôn ngữ cụ thể, không khuôn khổ cụ thể. nó là một lớp đơn giản, không có sự phụ thuộc với lớp khung cụ thể, bạn có thể sử dụng POCO trong tất cả các phiên bản .net bao gồm khung vi mô và khung công tác nhỏ gọn.

Đó là về kiểm tra

POCO thực sự dễ dàng để kiểm tra đơn vị bởi vì nó không có sự phụ thuộc với một lớp phi đơn vị thử nghiệm thân thiện.

Nó được về thay đổi

Upgrade/Downgrade, làm cho ứng dụng khách hàng mới trong environtment khác nhau như MONO? sẽ không có vấn đề gì, bạn có thể tiếp tục sử dụng dịch vụ và mô hình của bạn, ngay cả đối với lớp nâng cấp/giảm xuống tồi tệ nhất sẽ chỉ xảy ra trên Trợ giúp xem và dịch vụ trợ giúp.

Đó là về tự nhiên

tạo và làm việc với POCO được dễ dàng và tự nhiên, bạn có thể viết quá trình kinh doanh của bạn rõ ràng.

Nhưng hãy nhớ POCO là không thân thiện với khuôn khổ

Tôi đồng ý với Craig, POCO là TOO COOL, quá mát mẻ để làm quen với những người mới. nhìn vào WPF nó đòi hỏi một mô hình thực hiện INotifyPropertyChanged, những gì bạn làm để đạt được điều đó? bạn có thể tạo trình bao bọc hoặc bạn có thể tạo proxy động cho mô hình của mình. nhưng yêu cầu kỹ thuật và mã nâng cao hơn để duy trì.

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