2011-10-05 55 views
80

Tôi chỉ xem một vài webcast trước khi tôi đi đầu tiên trong việc thiết kế một vài ứng dụng Entity Framework. Tôi thực sự không đọc nhiều tài liệu đó và tôi cảm thấy như tôi đang đau khổ vì nó bây giờ.ICollection <T> Vs List <T> trong Entity Framework

Tôi đã sử dụng List<T> trong các lớp học của mình và nó đã hoạt động rất tốt.

Bây giờ tôi đã đọc một số tài liệu và nó nói rằng tôi nên đã sử dụng ICollection<T>. Tôi đã thay đổi điều này, và nó thậm chí không gây ra một thay đổi bối cảnh mô hình. Đây có phải vì cả hai số List<T>ICollection<T> kế thừa IEnumerable<T> và đó thực sự là điều bắt buộc đối với EF?

Tuy nhiên, nếu trường hợp này xảy ra, tại sao tài liệu EF nêu rõ rằng yêu cầu IEnumerable<T> thay vì ICollection<T>?

Trong mọi trường hợp, có bất kỳ nhược điểm nào đối với những gì tôi đã làm hay tôi nên thay đổi nó?

Trả lời

79

Khuôn khổ thực thể sẽ sử dụng ICollection<T> vì nó cần hỗ trợ hoạt động Add, không phải là một phần của giao diện IEnumerable<T>.

Cũng lưu ý rằng bạn sử dụng ICollection<T>, bạn chỉ đang hiển thị nó là triển khai List<T>. List<T> mang theo cùng với nó IList<T>, ICollection<T>IEnumerable<T>.

Đối với thay đổi của bạn, việc hiển thị thông qua giao diện là một lựa chọn tốt, mặc dù List<T> hoạt động. Giao diện xác định hợp đồng nhưng không xác định. Việc triển khai có thể thay đổi. Trong một số trường hợp, có lẽ việc triển khai có thể là một ví dụ HashSet<T>. (Đây là một suy nghĩ bạn có thể sử dụng cho nhiều hơn là chỉ Entity Framework, bằng cách này. Một thực hành hướng đối tượng tốt là chương trình hướng tới giao diện và không thực hiện. Triển khai có thể và sẽ thay đổi.)

+1

Vì vậy .... chỉ cho tôi hiểu một chút nữa - Danh sách thừa hưởng IList, mà thừa hưởng ICollection, mà thừa hưởng IEnumerable ? – wil

+1

Vâng, đó là chuỗi. 'Danh sách ' phải triển khai thực hiện từng giao diện đó ('IList ', 'ICollection ', 'IEnumerable ') vì hệ thống phân cấp thừa kế. Để hoàn thành, 'IList ' cũng chọn các giao diện 'IList',' ICollection' và 'IEnumerable' không chung chung. –

+0

Cảm ơn bạn ... Một số tính năng Ixxx vẫn thoát khỏi sự hiểu biết của tôi! Bạn đã có ý nghĩa, tuy nhiên, một điều cuối cùng đó là gây phiền nhiễu cho tôi, nếu Ixx kế thừa khác của IEnumerable, làm thế nào để nó thêm vào IEnumerable nếu một Ienumerable chỉ đọc? ... Nếu nó quá phức tạp, đừng lo lắng, khi tôi có một chút thời gian, tôi sẽ cố gắng kích hoạt phản xạ! – wil

40

Họ chọn giao diện họ đã làm bởi vì nó cung cấp một trừu tượng dễ hiểu về các truy vấn ma thuật mà Entity Framework thực hiện khi bạn sử dụng LINQ.

Đây là sự khác biệt giữa các giao diện:

  • IEnumerable<T> là read-only
  • Bạn có thể thêm và loại bỏ các mục vào một ICollection<T>
  • Bạn có thể làm truy cập ngẫu nhiên (bằng index) đến một List<T>

Trong số đó, ICollectionIEnumerable ánh xạ tốt tới các hoạt động cơ sở dữ liệu, kể từ khi truy vấn và thêm/loại bỏ các thực thể là những điều bạn có thể làm trong một DB.

Truy cập ngẫu nhiên theo chỉ mục cũng không được ánh xạ, vì bạn phải có kết quả truy vấn hiện tại để lặp lại hoặc mỗi truy cập ngẫu nhiên sẽ truy vấn lại cơ sở dữ liệu. Ngoài ra, bản đồ chỉ mục sẽ làm gì? Số lượng hàng? Không có nhiều truy vấn số hàng bạn muốn thực hiện và không có ích gì khi tạo các truy vấn lớn hơn. Vì vậy, họ chỉ đơn giản là không hỗ trợ nó.

ICollection<T> được hỗ trợ và sẽ cho phép bạn truy vấn và thay đổi dữ liệu, do đó hãy sử dụng dữ liệu đó.

Lý do List<T> hoạt động để bắt đầu là vì việc triển khai EF kết thúc trả lại một kết quả cuối cùng. Nhưng đó là ở cuối chuỗi truy vấn của bạn, không phải lúc đầu. Vì vậy, làm cho tài sản của bạn ICollection<T> sẽ làm cho nó rõ ràng hơn rằng EF tạo ra một loạt các SQL và chỉ trả về một List<T> ở cuối, thay vì làm truy vấn cho mỗi cấp độ của LINQ mà bạn sử dụng.

8

ICollection khác với IEnumerable ở chỗ bạn thực sự có thể thêm các mục vào bộ sưu tập, trong khi IEnumerable bạn không thể. Vì vậy, trong các lớp POCO của bạn, ví dụ, bạn muốn sử dụng ICollection nếu bạn có ý định cho phép bộ sưu tập được thêm vào. Làm cho ICollection ảo cũng được hưởng lợi từ việc tải xuống quá tải.

+1

Tôi muốn hiểu - bạn có thể thực hiện các thao tác tương tự (và nhiều hơn nữa!) Với Danh sách . Tại sao ICollection ? Tại sao không liệt kê ? Trông đơn giản và mạnh mẽ hơn. – monstro

+0

Danh sách Thực hiện ICollection và IEnumerable.Hoạt động nhiều hơn nhưng với điều đó có nhiều chi phí hơn. –

2

Mặc dù câu hỏi đã được đăng năm trước, nhưng câu hỏi vẫn hợp lệ khi ai đó đang tìm kiếm cùng một tình huống.

Có một bài viết CodeProject [2015] gần đây giải thích sự khác biệt về biểu diễn chi tiết và chi tiết với mã mẫu . Nó không phải là tập trung trực tiếp tại EF nhưng vẫn hy vọng nó sẽ được giúp đỡ nhiều hơn:

List vs IEnumerable vs IQueryable vs ICollection vs IDictionary

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