NHibernate - Koleksiyon Haritalama

Bu bölümde, koleksiyonların nasıl temsil edileceğini ele alacağız. NHibernate içinde kullanabileceğimiz farklı koleksiyon türleri vardır, örneğin:

  • Lists
  • Sets
  • Bags

Şimdi, .NET perspektifinden, genellikle listelerle ilgileniyoruz veya çok basit veri yapıları, listeler, sözlükler gibi. .NET çok çeşitli farklı koleksiyon türlerine sahip değildir. Öyleyse NHibernate'in tüm bu farklı tiplere neden ihtiyacı var? Gerçekten veritabanına geri dönüyor.

Liste

  • Liste, benzersiz olması gerekmeyen sıralı öğeler koleksiyonudur.

  • Bunu kullanarak haritalayabiliriz IList <T>.

  • Dolayısıyla, geleneksel olarak bir adres listesine sahip olsak ve uygulama açısından öğelerin benzersiz olduğunu bilsek de, listedeki hiçbir şey bu listeye yinelenen öğeler eklememizi engellemez.

Ayarlamak

  • Küme, benzersiz öğelerden oluşan sırasız bir koleksiyondur. Bir kümeye 2 yinelenen öğe eklemeye çalışırsanız, bir istisna atar.

  • NHibernate'de bununla ilgili özel bir şey yok.

  • Bu, genel bir küme uygulamasına sahip olmanın uygun bir yoludur. .NET 4'teyseniz, yeniHashSet <T> bunları temsil etmek için, ancak çoğu NHibernate uygulamasında bunun bir ISet olduğunu temsil ediyoruz.

  • Sırasızdır, eğer bir veri tabanından veya bir emir listesinden bir adres listesini geri alırsanız, maddeye göre belirli bir Sıraya koymadıkça hangi sırayla geldiklerini bilemezsiniz.

  • Yani genel olarak, bir veritabanından geri çektiğiniz veriler kümelerdir.

  • Sıralanmamış benzersiz öğe koleksiyonlarıdır.

Sırt çantası

  • Veritabanı dünyasında göreceğimiz bir diğer yaygın koleksiyon, yinelenen elemanlara sahip olabilmesi dışında tıpkı bir set gibi olan bir çantadır.

  • .NET dünyasında, bunu bir IList tarafından temsil ediyoruz.

Setler muhtemelen en yaygın olanıdır, ancak uygulamanıza bağlı olarak listeleri ve çantaları da göreceksiniz. Aşağıya bir göz atalımcustomer.hbm.xml Set emirlerinin tanımlandığı son bölümdeki dosya.

<?xml version = "1.0" encoding = "utf-8" ?> 
<hibernate-mapping xmlns = "urn:nhibernate-mapping-2.2" assembly = "NHibernateDemo" 
   namespace = "NHibernateDemo"> 
	
   <class name = "Customer"> 
      
      <id name = "Id"> 
         <generator class = "guid.comb"/> 
      </id> 
   
      <property name = "FirstName"/> 
      <property name = "LastName"/> 
      <property name = "AverageRating"/> 
      <property name = "Points"/> 
      <property name = "HasGoldStatus"/> 
      <property name = "MemberSince" type = "UtcDateTime"/> 
      <property name = "CreditRating" type = "CustomerCreditRatingType"/>
      
      <component name = "Address"> 
         <property name = "Street"/> 
         <property name = "City"/> 
         <property name = "Province"/> 
         <property name = "Country"/> 
      </component>
      
      <set name = "Orders" table = "`Order`"> 
         <key column = "CustomerId"/> 
         <one-to-many class = "Order"/> 
      </set> 
   
   </class> 
</hibernate-mapping>

Gördüğünüz gibi sipariş koleksiyonunu bir set olarak haritalandırdık. Bir setin sırasız benzersiz öğeler koleksiyonu olduğunu unutmayın.

Şimdi, Müşteri sınıfına bakarsanız, aşağıdaki programda gösterildiği gibi Siparişler özelliğinin bir ISet ile tanımlandığını göreceksiniz.

public virtual ISet<Order> Orders { get; set; }

Şimdi bu uygulama çalıştırıldığında aşağıdaki çıktıyı göreceksiniz.

New Customer:
John Doe (00000000-0000-0000-0000-000000000000)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Unspecified)
   CreditRating: Good
   AverageRating: 42.42424242

   Orders:
      Order Id: 00000000-0000-0000-0000-000000000000
      Order Id: 00000000-0000-0000-0000-000000000000

Reloaded:
John Doe (1f248133-b50a-4ad7-9915-a5b8017d0ff1)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: c41af8f2-7124-42a7-91c5-a5b8017d0ff6
      Order Id: 657f6bb0-1f42-45fc-8fc7-a5b8017d0ff7

The orders were ordered by:
John Doe (1f248133-b50a-4ad7-9915-a5b8017d0ff1)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: c41af8f2-7124-42a7-91c5-a5b8017d0ff6
      Order Id: 657f6bb0-1f42-45fc-8fc7-a5b8017d0ff7

John Doe (1f248133-b50a-4ad7-9915-a5b8017d0ff1)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: c41af8f2-7124-42a7-91c5-a5b8017d0ff6
      Order Id: 657f6bb0-1f42-45fc-8fc7-a5b8017d0ff7
		
Press <ENTER> to exit...

Koleksiyondaki öğelerin benzersiz olması gerekmiyorsa, bu koleksiyonda birden çok kez gerçekleşen aynı birincil anahtarla birden fazla siparişiniz olsaydı, bu, aşağıdaki programda gösterildiği gibi bir çanta olarak daha iyi eşleştirilebilirdi.

<bag name = "Orders" table = "`Order`"> 
   <key column = "CustomerId"/> 
   <one-to-many class = "Order"/> 
</bag>

Şimdi, bu uygulamayı çalıştırırsanız bir istisna elde edeceksiniz çünkü müşteri sınıfına bakarsak, siparişlerin C # kodunda ISet olarak işaretlendiğini fark edeceksiniz.

Bu yüzden bunu bir IList olarak değiştirmemiz gerekecek ve sonra burada, yapıcıdaki HashSet'ten List'e geçmemiz gerekecek.

public class Customer { 

   public Customer() { 
      MemberSince = DateTime.UtcNow; 
      Orders = new List<Order>(); 
   } 
	
   public virtual Guid Id { get; set; } 
   public virtual string FirstName { get; set; } 
   public virtual string LastName { get; set; } 
   public virtual double AverageRating { get; set; } 
   public virtual int Points { get; set; } 
	
   public virtual bool HasGoldStatus { get; set; } 
   public virtual DateTime MemberSince { get; set; } 
   public virtual CustomerCreditRating CreditRating { get; set; } 
   public virtual Location Address { get; set; }
   public virtual IList<Order> Orders { get; set; }
   public virtual void AddOrder(Order order) { Orders.Add(order); order.Customer = this; }
   
   public override string ToString() { 
      var result = new StringBuilder(); 
		
      result.AppendFormat("{1} {2} ({0})\r\n\tPoints: {3}\r\n\tHasGoldStatus:
         {4}\r\n\tMemberSince: {5} ({7})\r\n\tCreditRating: {6}\r\n\tAverageRating:
         {8}\r\n", Id, FirstName, LastName, Points, HasGoldStatus, MemberSince,
         CreditRating, MemberSince.Kind, AverageRating); result.AppendLine("\tOrders:"); 
      
      foreach(var order in Orders) { 
         result.AppendLine("\t\t" + order); 
      } 
		
      return result.ToString(); 
   } 
}

Uygulamayı çalıştırdığınızda aynı davranışı göreceksiniz. Ancak artık aynı koleksiyonda birden çok kez gerçekleşen bir siparişimiz olabilir.

John Doe (00000000-0000-0000-0000-000000000000)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Unspecified)
   CreditRating: Good
   AverageRating: 42.42424242

   Orders:
      Order Id: 00000000-0000-0000-0000-000000000000
      Order Id: 00000000-0000-0000-0000-000000000000

Reloaded:
John Doe (fbde48f5-d620-4d1c-9a7f-a5b8017c3280)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: 6dd7dbdb-354f-4c82-9c39-a5b8017c3286
      Order Id: 9b3e2441-a81b-404d-9aed-a5b8017c3287

The orders were ordered by:
John Doe (fbde48f5-d620-4d1c-9a7f-a5b8017c3280)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: 6dd7dbdb-354f-4c82-9c39-a5b8017c3286
      Order Id: 9b3e2441-a81b-404d-9aed-a5b8017c3287

John Doe (fbde48f5-d620-4d1c-9a7f-a5b8017c3280)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: 6dd7dbdb-354f-4c82-9c39-a5b8017c3286
      Order Id: 9b3e2441-a81b-404d-9aed-a5b8017c3287
		
Press <ENTER> to exit...