Saya hanya menonton beberapa webcast sebelum saya mulai mendesain beberapa aplikasi Entity Framework. Saya benar-benar tidak membaca dokumentasi sebanyak itu dan saya merasa saya menderita karenanya.
Saya telah menggunakan List<T>
di kelas saya, dan itu berhasil dengan baik.
Sekarang saya telah membaca beberapa dokumentasi dan menyatakan bahwa saya seharusnya menggunakan ICollection<T>
. Saya mengubahnya ke ini, dan itu bahkan tidak menyebabkan perubahan konteks model. Apakah ini karena keduanya List<T>
dan ICollection<T>
mewarisi IEnumerable<T>
, dan itulah yang sebenarnya diperlukan untuk EF?
Namun, jika hal ini terjadi, mengapa tidak negara dokumentasi EF yang membutuhkan IEnumerable<T>
bukan ICollection<T>
?
Bagaimanapun, apakah ada kerugian dari apa yang telah saya lakukan, atau haruskah saya mengubahnya?
List<T>
harus menerapkan masing-masing interface (IList<T>
,ICollection<T>
,IEnumerable<T>
) karena hirarki warisan. Untuk menyelesaikannya,IList<T>
ambil juga non-generikIList
,ICollection
danIEnumerable
antarmuka.ICollection<T>
ke pesta (dan antarmuka ini membawa sertaIEnumerable<T>
, jadi "normal "Operasi Linq masih berlaku).Mereka memilih antarmuka yang mereka lakukan karena memberikan abstraksi yang dapat dipahami atas kueri ajaib yang dilakukan oleh Entity Framework saat Anda menggunakan Linq.
Inilah perbedaan antar antarmuka:
IEnumerable<T>
bersifat hanya bacaICollection<T>
List<T>
Dari semua itu,
ICollection
danIEnumerable
petakan dengan baik ke operasi database, karena membuat kueri dan menambahkan / menghapus entitas adalah hal-hal yang mungkin Anda lakukan di DB.Akses acak menurut indeks juga tidak dipetakan, karena Anda harus memiliki hasil kueri yang ada untuk mengulang, atau setiap akses acak akan meminta database lagi. Juga, apa tujuan peta indeks? Nomor baris? Tidak banyak kueri nomor baris yang ingin Anda lakukan, dan itu sama sekali tidak berguna dalam membangun kueri yang lebih besar. Jadi mereka tidak mendukungnya.
ICollection<T>
didukung, dan akan memungkinkan Anda untuk menanyakan dan mengubah data, jadi gunakan itu.Alasan
List<T>
bekerja untuk memulainya adalah karena implementasi EF pada akhirnya mengembalikan satu pada akhirnya. Tapi itu di akhir rantai kueri Anda, bukan di awal. Jadi membuat properti AndaICollection<T>
akan membuatnya lebih jelas bahwa EF membuat sekumpulan SQL dan hanya mengembalikan aList<T>
di bagian akhir, daripada melakukan kueri untuk setiap level Linq yang Anda gunakan.sumber
ICollection berbeda dari IEnumerable karena Anda sebenarnya dapat menambahkan item ke koleksi, sedangkan dengan IEnumerable Anda tidak bisa. Jadi di kelas POCO Anda, misalnya, Anda ingin menggunakan ICollection jika Anda ingin mengizinkan koleksi ditambahkan. Jadikan ICollection virtual untuk mendapatkan keuntungan dari pemuatan lambat juga.
sumber
Meskipun pertanyaan tersebut telah diposting bertahun-tahun yang lalu, itu masih berlaku ketika seseorang mencari skenario yang sama.
Ada artikel CodeProject [2015] terbaru yang menjelaskan perbedaan secara mendetail dan representasi grafis dengan kode sampel . Ini tidak difokuskan secara langsung di EF tetapi tetap berharap ini akan lebih membantu:
Daftar vs IEnumerable vs IQuerable vs ICollection vs IDictionary
sumber