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…

Vuejs ve Typescript konuları

Son zamanlarda projelerimizde Vuejs ve typescript kullanıyoruz. Bu iki dünya ile ilgili olarak karşılaştığımız problemlerini ve çözümlerini elimden geldiğince burada paylaşmaya çalışacağım.