20 Mart 2015 Cuma

Fluent NHibernate Eşleştirme İlişki Çeşitleri


Herkese merhabalar.

   Bugün sizlere eşleştirme çeşitlerinden bahsetmek istiyorum. One-to-many, many-to-one, many-to-many, one-to-one olmak üzere 4 çeşit eşleştirme tipinden bahsedeceğiz. Bu eşleştirme çeşitlerini öğrenirken, geçen hafta anlatmış olduğum terimlerin kullanımını daha iyi anlayacaksınız.

1. One-to-One İlişkisi


    Bu eşleştirme tipinde Türkçe karşılığı ile bire bir ilişkisi vardır. Çok yaygın kurulan bir ilişki çeşidi değildir. Örnek verecek olursak; bir arabanın bir direksiyonu vardır ve o direksiyon da ancak bir arabaya ait olabilir. One-to-one ilişkisini aşağıdaki örnek ile daha iyi anlayacaksınız. Aşağıdaki örnekte; one-to-one ilişkisini sağlamak için iki sınıf da birbirinin özelliğini içermelidir. Tek çocuklu bir aileyi düşünün. Bir annenin sadece bir tane çocuğu vardır; aynı şekilde çocuğun da bir tane annesi vardır.

 public class Anne  
 {  
  public virtual int Id {get;set;}  
  public virtual string isim {get;set;}  
  public virtual string soyisim {get;set;}  
  public virtual Cocuk cocukisim { get; set; }  
 }  
 public class Cocuk  
 {  
  public virtual int Id {get;set;}  
  public virtual string isim {get;set;}  
  public virtual string soyisim {get;set;}  
  public virtual Anne anneisim;  
 }  


 public AnneMap()  
 {  
  HasOne(x => x.cocukisim)  
    .Cascade.All();  
 }  
 public CocukMap()  
 {  
  References(x => x.anneisim)  
    .Unique();  
 }  

   Yukarıda one-to-one mapping ilişkisinin genel yapısını görmüş olduk. Mapping sınıflarının içindeki HasOne ve References'ın kullanımına dikkat edin. References terimini kullanıyorsanız; bu ilişkinin karşılıklı birebir ilişkisi olduğunu belirtmek için Unique terimini kullanmayı unutmamalısınız [1].

2. Many-to-One İlişkisi


   Bu ilişki tipinden örneği ile birlikte ikinci hafta bahsetmiştik. Lütfen inceleyiniz. Bu ilişki çeşidini hatırlamak adına örnek verecek olursak; bir sınıf düşünün, bu sınıfın birden fazla öğretmeni olabilir; ama bir öğretmen sadece bir sınıfa ders veriyor şeklinde bir ilişki ayarlamak istediğiniz zaman many-to-one ilişkisi kurulmuş olacak. References teriminin many olan kısımda kullanıldığına dikkat ediniz.


3. One-to-Many İlişkisi


   Many-to-one ilişkisinin tersi şeklinde düşünebiliriz. Aşağıdaki örnek ile daha iyi anlayacaksınız [2].

 public class Sinif  
 {  
   public virtual int Id { get; set; }  
   public virtual string Ad { get; set; }  
   public virtual Ogretmen Ogretmen { get; set; }  
 }  
 public class SinifMap : ClassMap<Sinif>  
 {  
   public Sinif Map()  
   {  
     Id(u => u.Id).GeneratedBy.Identity();  
     Map(u => u.Ad).Nullable();  
     References(x => x.Ogretmen)  
       .Column("OgretmenId")  
       .Not.Nullable();   
   }  
 }  


 public class Ogretmen   
  {   
   public virtual int Id { get; set; }   
   public virtual string Ad { get; set; }   
   public virtual IList&lt;Sinif&gt; Siniflar { get; set; }   
   public Ogretmen()   
   {   
    Siniflar = new List&lt;Sinif&gt;();   
   }   
  }   
  public class OgretmenMap : ClassMap<Ogretmen>  
  {   
   public OgretmenMap()   
   {   
    Id(u =&gt; u.Id).GeneratedBy.Identity();   
    Map(u =&gt; u.Ad).Nullable();   
    HasMany(u =&gt; u.Siniflar)   
     .KeyColumn("OgretmenId")   
     .Inverse()   
     .Cascade.All();   
   }   
  }  

   
   Yukarıdaki örnekte bir öğretmen birden fazla sınıfın dersine girmektedir; ancak her sınıfa bir tane öğretmen girmektedir. Bu yüzden References terimi many olan "SinifMap" sınıfının içinde ve HasMany terimi ise one olan tarafta yazılmıştır [3].

4. Many-to-Many İlişkisi


   Yukarıdaki örnekten devam edecek olursak; bu ilişki tipinde,  bir sınıfın dersine birden fazla öğretmen girebiliyorsa, bir öğretmen de birden fazla sınıfın dersine girebilecektir. Aşağıdaki örnekte ise bir elbiseyi birden fazla kişi sipariş edebilir ve sipariş eden kişi birden fazla elbise sipariş edebilir. Böylelikle many-to-many ilişkisi sağlanmış olur [4].

 class Siparis  
 {  
   public virtual IList<Giysi> Giysiler { get; protected set; }  
 }  
 class Giysi  
 {  
   public virtual IList<Siparis> Siparisler { get; protected set; }  
 }  


 public class SiparisMap : ClassMap<Siparis>  
 {  
   public SiparisMap()  
   {  
     HasManyToMany(x => x.Giysiler)  
       .Cascade.All()  
       .Table("SiparisGiysi");  
   }  
 }  
 public class GiysiMap : ClassMap<Giysi>  
 {  
   public GiysiMap()  
   {  
     HasManyToMany(x => x.Siparisler)  
       .Cascade.All()  
       .Inverse()  
       .Table("SiparisGiysi");  
   }  
 }  


   Bugünlük anlatacaklarım bu kadar, bir sonraki yazımda CRUD işlemlerinden bahsedeceğim, hoşçakalın..

Kaynaklar

[1] Fluent NHibernate One-to-One mapping, http://stackoverflow.com/questions/15724562/fluent-nhibernate-one-to-one-mapping, Mart 18, 2015.

[2]NHIBERBATE 2: MAPPING RELATIONSHIPS AND FLUENT MAPPING, https://www.packtpub.com/books/content/nhibernate-2-mapping-relationships-and-fluent-mapping, Mart 18, 2015.

[3] Fluent NHibernate Has Many Mapping, http://frankdecaire.blogspot.com.tr/2014/04/fluent-nhibernate-hasmany-mapping.html, Mart 19, 2015.

[4]Many to Many Mapping in Fluent NHibernate,  http://www.duncanmcdougall.co.uk/articles/manytomany-fluentnhibernate.html, Mart 19, 2015.

Hiç yorum yok:

Yorum Gönder