Kasım 21, 2010 at 4:03
—
mehmet.baran
Merhaba,
Bu yazımda NHibernate'in pek bilinmeyen bir özelliğinden bahsedeceğim. NHibernate de pocolar için insert, update, delete ve select queryleri dinamik olarak üretilmektedir. Bu queryler oluşturulurken "poco_name.hbm.xml" dosyalarındaki table-class mapping bilgilerinden yararlanılır. Burada tablo ismi ve sütun isimleri alınarak bir query oluşturulur.
Peki bu isimlendirmelere çalışma zamanında nasıl müdahele edebiliriz? Bunu INamingStrategy interface'ini implemente ederek yapabiliriz. Örneğin aşağıdaki sınıfı inceleyelim.
public class NamingStrategyImpl : INamingStrategy
{
public string ClassToTableName(string className)
{
return DefaultNamingStrategy.Instance.ClassToTableName(className);
}
public string PropertyToColumnName(string propertyName)
{
return DefaultNamingStrategy.Instance.PropertyToColumnName(propertyName);
}
public string TableName(string tableName)
{
tableName = tableName.ToUpper();
return DefaultNamingStrategy.Instance.TableName(tableName);
}
public string ColumnName(string columnName)
{
columnName = columnName.ToLower();
return DefaultNamingStrategy.Instance.ColumnName(columnName);
}
public string PropertyToTableName(string className, string propertyName)
{
return DefaultNamingStrategy.Instance.PropertyToTableName(className, propertyName);
}
public string LogicalColumnName(string columnName, string propertyName)
{
return DefaultNamingStrategy.Instance.LogicalColumnName(columnName, propertyName);
}
}
Burda tableName, columnName vs. değerlerinin oluştuğu metodlar bulunmaktadır. Örneğin dinamik oluşturulacak query içinde tablo adı öncelikle poco_name.hbm.xml dosyasından okunur sonra burdaki TableName metoduna parametre geçilerek geri alınan değer kullanılır. Örnekte tablo ismi büyük harflere çevrilmiştir. Benzer şekilde tablo ismi üzerinde ihtiyaca göre çeşitli değişiklikler yapılabilir. Çalışan sistemlerde veritabanı değişikliklerinde bazen bu tür kodlar işimizi oldukça kolaylaştırabilir.
Peki bu sınıfı yazdıktan sonra NHibernate kütüphanesinin bu implementasyonu kullanmasını nasıl sağlayacağız? Cevabı basit. SessionFactory nesnesi oluştururken. Örnek kod aşağıdadır.
var config = new Configuration();
config.SetNamingStrategy(new NamingStrategyImpl());
_SessionFactory = config.Configure().BuildSessionFactory();
Kolay gelsin