NHibernate - Pemetaan Koleksi
Dalam bab ini, kami akan membahas bagaimana merepresentasikan koleksi. Ada berbagai jenis koleksi yang dapat kami gunakan di dalam NHibernate seperti -
- Lists
- Sets
- Bags
Sekarang, dari perspektif .NET, kita biasanya berurusan dengan daftar atau menyukai struktur data, daftar, kamus yang sangat sederhana. .NET tidak memiliki berbagai jenis koleksi yang berbeda. Jadi mengapa NHibernate membutuhkan semua jenis yang berbeda ini? Ini benar-benar kembali ke database.
Daftar
Daftar adalah kumpulan elemen yang tidak selalu unik.
Kita bisa memetakannya menggunakan IList <T>.
Jadi meskipun kita mungkin secara konvensional memiliki daftar alamat, dan dari sudut pandang aplikasi kita tahu bahwa elemennya unik, tidak ada dalam daftar yang mencegah kita memasukkan elemen duplikat dalam daftar itu.
Set
Satu set adalah kumpulan elemen unik yang tidak berurutan. Jika Anda mencoba memasukkan 2 elemen duplikat ke dalam satu set, itu akan memunculkan pengecualian.
Tidak ada yang spesifik di NHibernate tentang itu.
Ini hanya cara yang nyaman untuk memiliki implementasi set generik. Jika Anda menggunakan .NET 4, Anda dapat menggunakan yang baruHashSet <T> untuk mewakili ini, tetapi di sebagian besar aplikasi NHibernate, kami menyatakan ini adalah ISet.
Ini adalah unordered, jika Anda menarik kembali daftar alamat dari database atau daftar pesanan, Anda tidak tahu apa pesanan mereka datang kecuali Anda memasukkan Urutan berdasarkan klausa tertentu.
Jadi secara umum, data yang Anda tarik kembali dari database adalah kumpulan.
Mereka adalah koleksi elemen unik yang tidak berurutan.
Tas
Koleksi umum lainnya yang akan kita lihat di dunia database adalah tas, yang seperti satu set kecuali dapat memiliki elemen duplikat.
Di dunia .NET, kami mewakili ini dengan IList.
Set mungkin yang paling umum, tetapi Anda akan melihat daftar dan tas juga tergantung pada aplikasi Anda. Mari kita lihat di bawah inicustomer.hbm.xml file dari bab terakhir di mana pesanan Set didefinisikan.
<?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>
Seperti yang Anda lihat, kami telah memetakan koleksi pesanan sebagai satu set. Ingatlah bahwa satu set adalah kumpulan elemen unik yang tidak berurutan.
Sekarang, jika Anda melihat kelas Pelanggan, Anda akan melihat bahwa properti Pesanan ditentukan dengan ISet seperti yang ditunjukkan dalam program berikut.
public virtual ISet<Order> Orders { get; set; }
Sekarang ketika aplikasi ini dijalankan, Anda akan melihat output berikut.
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...
Jika item dalam koleksi tidak harus unik, jika Anda dapat memiliki beberapa pesanan dengan kunci utama yang sama yang terjadi beberapa kali dalam koleksi ini, maka ini akan lebih baik dipetakan sebagai tas seperti yang ditunjukkan dalam program berikut.
<bag name = "Orders" table = "`Order`">
<key column = "CustomerId"/>
<one-to-many class = "Order"/>
</bag>
Sekarang, jika Anda menjalankan aplikasi ini, Anda akan mendapatkan pengecualian karena jika kita melihat kelas pelanggan, Anda akan melihat bahwa pesanan ditandai sebagai ISet dalam kode C #.
Jadi kita juga perlu mengubahnya menjadi IList dan kemudian di sini, kita perlu mengubah dari HashSet ke Daftar di konstruktor.
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();
}
}
Saat Anda menjalankan aplikasi, Anda akan melihat perilaku yang sama. Tapi, sekarang kita bisa memiliki pesanan yang terjadi beberapa kali dalam koleksi yang sama.
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...