10 Şubat 2015 Salı

NHibernate ile Update Sorgusu Oluşturma

NHibernate ile hiç Entity'i alıp üzerinde değişiklik yapıp sonrada update komutunu çalıştırmadan sadece sorgu ile bir işlem yapmak bazen çok daha iyidir. Bu benimde kullandığım yöntemlerden bir tanesi. Örnek olarak EUser ismindeki entity içerisindeki LastOperationDateTime alanını her sayfa isteğinde o anki tarih ve saat ile set etmek istiyorum. O zaman bunu uzun yoldan EUser entity'sini çek sonrada değeri değiştir ve kaydet yöntemi ile yapmak biraz maaliyetli oluyor. Bu noktada benim yaptığım ise bir update sorgusu yazmak :

public DateTime SetLastOperationDateTime(long userId)
{
    var dateTime = DateTime.Now;
    //Session.CreateQuery("UPDATE EUser SET LastOperationDateTime = :dt where Id = :id")
    //    .SetDateTime("dt", dateTime)
    //    .SetInt64("id", userId)
    //    .ExecuteUpdate();
    var q = Session.GetNamedQuery("SetLastOperationDateTime");
    q.SetDateTime("dt", dateTime);
    q.SetInt64("id", userId);
    q.ExecuteUpdate();
 
    return dateTime;
}

yukarıda 2 ayrı örnek bulunmakta yorum satırları içine aldığım benim hql i kontrol ettiğim normal hql query'si oluşturma yöntemi. Bu yöntem eğer bu sorguyu birden fazla kere kullanacaksanız yavaş kalabilir. Bende bu yüzden hql ile ilgili bir problem olmadığına karar verdiğimde bunu named query haline getiriyorum. Kısaca named query sorguları NHibernate'in kullanıma hazırlandığı sırada bir kere derlemesi ve sonrasında bu derlenmiş sorguları kullanarak daha hızlı çalışması anlamına geliyor. Şimdide kısaca nasıl kullanıldığına bakalım :
1. Önce projenizde bir hbm.xml dosyası oluşturmanız lazım :
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <query name="SetLastOperationDateTime">
    UPDATE EUser 
    SET LastOperationDateTime = :dt 
    where Id = :id
  </query>
</hibernate-mapping>

Bu dosyalar NHibernate'in mapping bilgilerini de tutmakta. Ama ben Fluent NHibernate kullandığım için mapping'lerim sınıflar şeklinde. Bu dosyada sadece Named Query'ler için ayrılmış durumda. unutmamamız gereken en önemli nokta bu dosyaların istediğimiz gibi çalışabilmesi için mutlaka Build Action olarak Embeded Resource olarak seçilmelerinin gerekliliği.


birde eğer Fluent NHibernate kullanıyorsanız bu dosyaların kullanıma alınabilmeleri için FluentConfiguration'da Mapping metodu içine şu satırı da eklemek gerekmekte :
m.HbmMappings.AddFromAssemblyOf<DBConfig>();

DBConfig benim projem içindeki named query'lerin bulunduğu assembly içindeki bir class.

Bu konudaki başka örnekler için :
NHibernate Update query : http://bit.ly/1ARmnfF
Execute UPDATE and return the record just updated using NHibernate CreateSQLQuery method? : http://bit.ly/1zRosoS
Yorum Gönder