"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).
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
@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