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(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].
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, 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.
[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.
Güzel bir yazı olmuş, emeğine sağlık :)
YanıtlaSilTeşekkür ederim :)
YanıtlaSil