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

Vue.js, Vuetify, Typescript ve Jest ile unit test yazmak

Vue.js, Vuetify, Typescript ve Jest ile unit test yazmak Writing unit test with Vue.js, Vuetify, Typescript and Jest
Geliştirmekte olduğumuz proje kapsamında Vue.js, Vuetify ve Typescript ile çalışmaktayız. Burada unit test yazmak istediğimizde biraz araştırma yapmak, ve çıkan problemlerle boğuşmak zorunda kaldık. Bu yazıda bulduğumuz çözümler ile konuyu anlatmak istiyorum :
Öncelikle unit test aracı olarak jest kullanmaya karar verdik. Vue.js Cli tarafından öncelik Mocka'ya verilmiş olsada bizim projemizde onu açlıştırmak hiç kolay olmadı. Sıkıntı typescript kullanmamızdan kaynaklanmakta. bu iş için kullanacağımız araçların hepsi typescript destekli değil maalesef. Gelelim adımlara :
1. npm ile bazı paketleri projemize eklememiz lazım :
npm i -D jest@23.6.0 jsdom@13.2.0 jsdom-global@3.0.2 ts-jest@23.10.5 @vue/test-utils @vue/cli-plugin-unit-jest @vue/cli-plugin-typescript

Burada önemli nokta jest sürümünün 23'de kalması. Çünkü ts-jest şu anda (11.02.2019 itibari ile) sadece je…

MongoDB'yi Çalıştırmak

MongoDB'yi development makinamıza kurduktan sonra (kurulumu şu makalemde görebilirsiniz), artık onunla çalışmamız lazım. Ancak bunun için öncelikle mongo db 'nin çalışır hale gelmesi gerekiyor. Bu işlem 2 şekilde olabilir.
1. ihtiyaç olduğunda mongodb'yi elle çalıştırabilirsiniz
2. mongodb yi windows servis olarak çalıştırıp, bilgisayar her çalıştığında otomatik olarak çalışmasını sağlayabilirsiniz.

Öncelikle mongodb'yi command prompt'dan çalıştırabilmek için bir ayar yapmamız lazım. Bunun için önceki makaleme bakabilirsiniz : http://www.alperkonuralp.com/2016/10/mongodbyi-command-prompttan-calstrmak.html

Şimdide MongoDB'nin veri tabanı dosyalarını depolayabilmesi için gerekli olan dizinleri oluşturalım.
1. Command Prompt açılır. ( bunun için start tuşunda cmd yazıp enter'e basmanız yeterli olacaktır. Ancak yönetici yetkileri ile açmak daha iyi olacağı için cmd yazdığınızda görünen programa sağ tıklayıp yönetici olarak aç seçeneği ile açmanız daha iyi olaca…

Ubuntu 14.10'da Uyku Moduna geçme problemi

Ubuntu'yu 14.10'a yükselttikten sonra Laptop'un kapağını kapattığımda sistemin uyku moduna geçmediğini farkettim. Bu konuda bir araştırma yaptım ve bulduğum şu sayfadaki çözüm işimi çözdü.

1. Terminal ekranını açın(ctrl+alt+t) ve aşağıdaki kodu girin :
sudo nano /etc/systemd/logind.conf 

2. Bu dosyada :
#HandleLidSwitch=suspend 
şeklinde bir satır göreceksiniz. Bu satırın başındaki # işaretini kaldırım. Nano'dan çıkmak için Ctrl+x yapın, sonrada y tuşuna basın. İşte hepsi bu kadar.

After upgrade my laptop to Ubuntu 14.10, when I close the lit, laptop isn't gone to suspend. I was search the google for this issue, I found the solution in this page.  This solution is :

1. Open the terminal(ctrl+alt+t) and write this code :
sudo nano /etc/systemd/logind.conf 

2. In this window, find this line :
#HandleLidSwitch=suspend
remove this # chars at the begin of line. For Save and close nano, press ctrl+x and y .

That is it.