15 Mart 2015 Pazar

Fluent NHibernate ile İlişkisel Nesneler Tasarlamak, Lazy Loading ve Eager Loading


Herkese merhabalar.

Bugün sizlere ilişkisel nesneler tasarlarken bilmeniz gereken bazı kavramlardan ve Fluent NHibernate'de bilmeniz gereken önemli noktalardan ikisi olan Lazy Loading ve Eager Loading'ten bahsetmek istiyorum. 

Id

   Id metodu kullanılarak Id eşleştirilmesi yapılır [1].

 Id(x => x.Id);  

Map edilecek olan Id'nin ismi Id olarak istenmiyorsa Column metodu kullanılarak aşağıdaki şekilde değiştirilebilir [1].

 Id(x => x.Id)  
  .Column("ogrenciId")  
  .GeneratedBy.Assigned();  

Map

Map metodu ile veritabanı ve class'ların eşleşitirlmesi yapılır [1].

 Map(x => x.FirstName);  

References

   Many to one ilişkilendirilmesinde kullanılır. Many tarafında yazılır. Bunun bir örneğini geçen haftaki yazımda incelemiştik. Many olan tarafta yazılır. HasMany/one-to-many, References ilişkilendirilmesinin bir başka türüdür one tarafında yazılırlar [1].

HasManyToMany/many-to-many

Many to many ilişkilendirilmesinde kullanılır [2].

 HasManyToMany(x => x.Kitaplar);  

HasOne/one-to-one

   One to one ilişkilendirilmesinde kullanılır. Bu ilişkilendirilmede HasOne metodunu kullanıyorken foreign key'inizi belirtmek isterseniz; PropertyRef() metodunu kullanabilirsiniz. Eğer References metodunu kullanıyorsanız; çift taraflı eşleştirmenin one-to-one olduğunu göstermek için .Unique() belirtecini kullanmalısınız [1].

 public class ArabaMap : ArabaMap<Araba>  
 {  
   public ArabaMap()  
   {  
     Table( "Araclar.dbo.Araba" );  
     Id( x => x.ArabaId );  
     Map( x => x.Ad );  
     Map( x => x.yil );  
     HasOne( x => x.Direksiyon ).PropertyRef( x => x.Araba);  
   }  
 }  
 public class DireksiyonMap : ClassMap<Direksiyonl>  
 {  
   public DireksiyonMap()  
   {  
     Table( "Araclar.dbo.Direksiyon" );  
     Id( x => x.DireksiyonId );  
     Map( x => x.Cap );  
     Map( x => x.Renk );  
     References( x => x.Araba, "ArabaId" ).Unique();  
   }  
 }  

Yukarıdaki örnekte araba ile direksiyon eşleştirilmesi one-to-one olmuştur ve bu ilişki eşleştirme sınıflarında yukarıdaki şekilde belirtilmelidir. Her arabanın bir tane direksiyonu olur ve o direksiyon ancak bir tane arabaya ait olabilir.

Lazy Loading

   Lazy Loading veya Eager Loading'in etkin olması durumu programın performansını önemli derecede etkilemektedir. Lazy loading, nesneyi oluşturduğuz zaman o nesneye bağlı olan diğer nesneler de çağırdığınızda onunla birlikte gelmemesi durumudur [3]. Çağırılan nesne ile ilgili diğer nesenelerinde beraberinde glmesini istiyorsanız, Lazy Loading etkinken bu durumu belirtmeniz gerekmektedir. Çağrılan ilgili veri persistent, ona bağlı olan veri ise transient olarak geçmektedir. Lazy Loading, olabildiğince minimum veri ile çalışmayı sağlayarak programın performansını arttırmak için kullanılır. Fluent NHibernate'de default olarak Lazy Loading etkindir [4].

   Lazy Loading'in default olarak gelmesini istemiyorsanız aşağıdaki kod parçası ile bu özelliği devre dışı bırakabilirsiniz [3].

 Not.LazyLoad();  

Geçen hafta bahsettiğimiz convention sınıflarında aşağıdaki kod parçası ile Lazy Loading'i devre dışı bırakabilirsiniz.

 var conventions = new Conventions();  
 conventions.DefaultLazyLoad = false;  
 
Eşleştirme sınıfınızın içinde aşağıdaki şekilde Lazy Loading'i devre dışı bırakabilirsiniz.

  using System;
using System.Collections.Generic;
using System.Linq; using System.Text;
using IlkFluentNHibernateProjem.Entites;
using FluentNHibernate.Mapping;
public class OgrenciMap : ClassMap<Ogrenci>
namespace IlkFluentNHibernateProjem.Mapping { { //Constructor
public OgrenciMap() { Id(x => x.Id); Map(x => x.Ad);
References(x => x.OgrenciBolum).Column("BolumId").Not.LazyLoad();
Map(x => x.Soyad); Map(x => x.Donem); Table("Ogrenci"); } }
}

Eager Loading

   Eager loading, nesneyi oluşturduğuz zaman o nesneye bağlı olan diğer nesnelerin de çağırmadığınız halde otomatik olarak onunla birlikte gelmesi durumudur [5]. Gereksiz verilerin de ilgili veri ile gelmesi, programın performansını Lazy Loading kullanımına kıyasla yadsınamayacak kadar düşürecektir [5].

   Bugünlük anlatacaklarım bu kadar, bir sonraki yazımda eşleştirme çeşitlerine yönelik örnekler yapacağız, şimdilik hoşçakalın..

Kaynaklar

[1]  Fluent Mapping, https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping, Mart 11, 2015.

[2] Fluent-nhibernate-create-many-to-many-relationship-table, https://d4dilip.wordpress.com/2011/01/15/fluent-nhibernate-create-many-to-many-relationship-table/, Mart 11, 2015.

[3] Difference between Lazy Loading and Eager Loading, http://www.dotnet-tricks.com/Tutorial/entityframework/RIWW210913-Difference-between-Lazy-Loading-and-Eager-Loading.html, Mart 12, 2015.

[4] Lazy Loading in Fluent NHibernate, http://tempvalue.blogspot.com.tr/2012/05/lazyloading-in-fluent-nhibernate.html, Mart 12, 2015.

[5] Not.LazyLoad - Eager Loading with NHibernate 3.0, http://www.philliphaydon.com/2011/01/not-lazyload-eager-loading-with-nhibernate-3-0/ Mart 13, 2015.

2 yorum: