Ana içeriğe atla

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

Yorumlar

Bu blogdaki popüler yayınlar

Babamın durumu

Babam Mart 2017 de zatüreden hastanede yatmıştı. Bu sırada ciğerlerde bir kanser görülmüş. Bu kanserin ne olduğu ile ilgili tetkikler de başlamış. Zatüreden sonra hemen kanser ile ilgili işlemlere yoğunlaşıldı. Kalçada görülen bir kitle vardı. Ona da baktılar ama temiz çıktı. Kanser tedavisi olan kemoterapi hemen başladı. 14 haziranda ilk kemoterapi dozunu aldı. İlk günler iyiydi. 19 hazirandan itibaren durumu kötülemeye başlamış. En son 21 Haziran gecesi çok kötü olunca önce Torbalı Devlet Hastanesine götürüldü. Burada vücudundaki sodyum'un çok azalmış olmasından dolayı hemen sodyum takviyesi yapıldı. Sodyum takviyesi ancak bir oranda etkili olduktan sonra yine kötü duruma geri dönüş yapmış. Bu yüzden Bozyaka araştırma hastanesine sevkedildi. Bozyaka da önce dahiliye yoğun bakıma alındı. Ancak burada bir süre kalbi durmuş ve kalp masajı ile geri getirmişler. Sonrada genel yoğun bakıma aldılar.
Şu an yoğun bakımda hipotermi durumunda tutuluyor. Bu uygulanan tedavilerden biri. Diğer…

Azure Cosmos DB Emulator Çalışmıyor.

Merhaba, Bugün Azure Cosmos DB'ye bir göz attım. Kullanımını anlamak için kendi bilgisayarımıza bir emulator(Azure Cosmos DB Emulator) kurabiliyoruz. Bunu kurup çalıştırdığımda DocumentDB.StartupEntryPoint.exe'nin hata verdiğini gördüm. Hatanın detayını eventviewer'dan şöyle gördüm:

Git'te GitCredentialWinStore ile ilgili alınan hatanın çözümü

Git kurulumundan sonra remote(sunucu) ile ilgili işlemler yaptığınızda session açık olsada tekrar tekrar kullanıcı adı ve şifre soruyor ve mesaj ekranında aşağıdaki gibi bir hata alıyorsanız:
"C:\Program Files (x86)\GitExtensions\GitCredentialWinStore\git-credential-winstore.exe" erase: C:\Program Files (x86)\GitExtensions\GitCredentialWinStore\git-credential-winstore.exe: No such file or directory bu durumda  git'in şifre saklama sisteminde bir problem oluştuğunu görmekteyiz. Bunun çözümü olarak öncelikle https://github.com/Microsoft/Git-Credential-Manager-for-Windows adresinden Windows için git şifre yönetim aracını indirmeniz ve kurmanız gerekiyor. Dosyanın tam indirme linki :
https://github.com/Microsoft/Git-Credential-Manager-for-Windows/releases
şeklindedir. Güncel versiyonu buradan indirip kurduktan sonra GIT BASH ile 2 satırlık bir işlem yapmamız gerekiyor.

1. öncelikle git'in geçerli şifre yöneticisini siliyoruz :

git config --global --unset credential.helper