Yanıtlar:
NHibernate semantiği:
Liste: Varlıkların sıralı koleksiyonu, kopyaya izin verilir. Kodda bir .NET kullanın IList
. Dizin sütununun NHibernate'de eşlenmesi gerekecektir.
Set: Sırasız benzersiz varlık koleksiyonu, kopyalara izin verilmez. Iesi.Collection.ISet
Kodda kullanın (v4'ten önceki NH) veya System.Collections.Generic.ISet
(NH v4 +). Yinelenen iş tanımını geçersiz kılmak GetHashCode
ve Equals
belirtmek önemlidir . Bir sıralama tanımlanarak veya bir SortedSet
sonuçla sonuçlanan bir karşılaştırıcı tanımlanarak sıralanabilir .
Çanta: Sırasız varlık listesi, kopyalara izin verilir. Kodda bir .NET kullanın ICollection<T>
. Listenin dizin sütunu eşlenmemiştir ve NHibernate tarafından dikkate alınmamıştır.
NHibernate'deki tüm bu nesneler, bu Soyut Veri Tiplerinin (ADT) diğer uygulamaları ile tamamen aynıdır. Diğer şeyler için isimlerin ne kadar yaygın olduğu için Setleri ve Çantaları çevrimiçi olarak bulmanın ne kadar zor olduğuna şaşırdım, bu yüzden burada bazı bağlantılar ve açıklamalar listeledim.
Daha ayrıntılı bilgi için aşağıdakilere bir göz atın: Listeler , Setler ve Çantalar
Genel kurallar:
Listeler varsayılan olarak sıralanmıştır, bir nesneyi dizinine göre çekebilmek istiyorsanız veya for
döngülerin üzerinden tuhaf bir döngü düşkünlüğünüz varsa bunları kullanın foreach
. Bir Bağlantılı Listede olması gerektiği gibi bunlara erişmeniz gerekmez . Bu ADT, kopyalara izin verir.
Lütfen aklınızda bulundurun! Listeler BryanD'nin cevabında belirtildiği gibi sıralanmasına rağmen, komuta göre bir sıralama belirtmediğiniz sürece bir HQL sorgusu yürüttüğünüzde veritabanından beklediğiniz sırada olması gerektiğini söyleyen hiçbir şey yoktur. Bu nedenle, bazı insanlar bunun yerine Set veya Bags kullanmayı severler, böylece sipariş verildiği yanılsamasını vermez. Bunu söylememe rağmen, NHibernate'in çalıştırdığı sorguda bulunma sırasına göre listeye eklendiklerinden çoğu zaman görünür bir sırada görünecekler.
Setler vardır değil varsayılan sipariş ederek, dizin kullanarak doğrudan herhangi bir değişkeni erişemez. Kümeler varsayılan olarak, nesnelerinin benzersizliğini koruyan yukarıdaki üç ADT'den tek ADT'dir . Kopya içermemeniz gerekiyorsa, bir koleksiyonunuz varsa bunlar harikadır.
Çantalar (veya Çoklu Kümeler ), yukarıdaki bağlantılardan da görebileceğiniz gibi, içindeki nesnelerin diğer nesnelerin kopyası olmasına izin veren bir Küme türüdür. Liste sıralaması göz ardı edilebileceğinden ve bu nedenle Çanta olarak değerlendirilebileceğinden, bunlar genellikle kullanılmaz.
Bunların NHibernate'de nasıl kullanıldığına bağlı olarak, burada hangi ADT'yi seçtiğinize bağlı olarak veritabanından hiçbir şey farklı şekilde çekilmez, farklı ADT'yi seçmeniz için onu kullanmak istediğiniz şey budur.
Kişisel olarak, genellikle alt nesnelerin benzersiz olmasını istediğim ve sıralama bir sorun olmadığından çoğu şey için Setleri kullanıyorum. Örneğin, bir şeye göre sıralanmasını istediğim bir grup nesneye sahip olduğum Listeleri kullanacak olsam da, bu sırayı elde etmek için HQL sorgusunda "sıralama ölçütü" nü manuel olarak ayarlamam gerekiyor.
Temel fark, listelerin, listedeki konumlarına göre indekslenmiş öğeler için örtük bir sıralamaya sahip olmasıdır. Setler ve çantalar, genellikle bir Karşılaştırıcı tarafından veya bu öğeler DB'den çıktığında uygulanan maddeye göre "sıralanabilir". Kişisel olarak, hiç Çanta kullanmadım ... İstediğim verilerin sıralı olarak sıralandığını bilirsem List'i, yoksa Set'i kullanırım.
ISet
yerine sadece normal kullanamaz mıyızIesi
?