Dapper .Net için Micro ORM

Ado.Net  Microsoft .Net  Kasım 13, 2016

Merhaba Arkadaşlar

Bu yazımda Dapper nedir, neden kullanmalıyız ve Entity Framework ile karşılaştırmasını yaparak bir örnekle de açıklamaya çalışacağım.

Dapper .Net ortamları için Micro ORM dir. Micro kelimesi neden var aslına bakarsanız tam olarak ORM katmanı görevi yapmamaktadır. Yani objeleri data ile birebir işleyememektedir. Ancak bu kötü bir şey gibi gelmesin hemen gözümüze. Bazen (bazen dememe bakmayın bir çoğu kez) Entity framework gibi Linq üzerinde işlem yapan bir yapıyı yönetmek için epeyce çaba sarf ettiğimiz olmuştur. Bu işi kolaylaştırmak için çeşitli patternler vs kullanmak durumu da cabası. Her ne ise eğer amacınız çok katmanlı bir yazılım geliştirip nesneleri yönetilebilir katmanlarda kullanmak değil ise dapper sizin için oldukça ideal bir çözüm olabilir.

Buraya kadar dapperi azda olsa açıklamış niye kullanmamız gerek bahsetmiş ve EF ile karşılaştırmış oldum 🙂 Bence bunu anlamanın en iyi yolu örnek üzerinden çalışmak. Bu yüzden bir proje oluşturup üzerine çalışacağız.

Bir console uygulaması yapalım zaten ASP.Net vs de aynı mantıkla olacağı için sorun çekmezsiniz. Projemizi oluşturduktan sonra hemen dapper i nuget ile projemize ekleyelim.

2016-11-13 19_55_18-DapperSample

Yukarıda ki paketi seçip projemize ekledikten sonra gelelim veritabanımızı oluşturmaya. Projemize bir Data klasörü ekleyip bunun da içine Add>New Item>Service-based Database seçerek Sample.mdf adında bir veritabanı oluşturuyorum. Sonra eklediğimiz dosyaya çift tıklayıp server explorer den görüntülüyorum.

2016-11-13 20_23_44-DapperSample

Şimdilik veritbanımızda hiç tablo yok. O yüzden tablo altında bir gözükmüyor. Hemen bir tablo oluşturalım bakalım. Tablomuz telefon defteri olsun. Aşağıda ki gibi bir tablo oluşturuyorum.

2016-11-13 20_34_01-DapperSample

Veritabanımız hazır olduğuna göre artık işlemlere başlayabiliriz. Öncelikle connectionstring olayından başlayalım. Bunun için app.config açarak connectionstring ekleyelim.

 <connectionStrings>
 <add name="default" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=E:\BLOGPROJELER\DOTNET\DAPPER\DAPPERSAMPLE\DAPPERSAMPLE\DATA\SAMPLE.MDF;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient" />
 </connectionStrings>

Yukarıda verdiğim örnek benim pc için geçerli olan yapılandırma ile alakalı sizin pc nizde farklılıklar gösterecektir.

Projemizde verileri üzerinde kullanacağımız POCO model ve veri bağlantısı için CRUD context oluşturalım. İlk olarak Model adında bir klasör oluşturmakta fayda var. İçerisine aşağıda ki gibi sınıflarımızı oluşturalım. İlk önce model sınıfı.

2016-11-13 20_54_17-DapperSample

CRUD sınıfı adım adım oluşturacağız. Böylece ne neden var görürüz.

 

DbContext adında ki sınıfımızı oluştururken sınıfın kullanacağı bazı referansları eklememiz gerek. Bunlar Dapper; System.Data; System.Data.SqlClient; uzayları. Ayrıca projenize Referances kısmından System.Configuration eklemeyi de unutmayın.

2016-11-14 00_09_31-DapperSample

Dapper IDbConnection a extension olarak geliştirilmiştir. Bu yüzden direk dapperi kullanmıyoruz bir bağlantı oluşturup bunun üzerinde çalışacağız. Bu yüzden private bir connection oluşturucu fonksiyon ekledim hızlı olsun diye performans açısından düzenleme yapabilirsiniz. Hatta Singleton bir mimari daha iyi olur.

Kısaca üzerinden geçeyim kodun. GetAll ile tüm kayıtları listeleme işlemi yapıyoruz tabi siz isterseniz parametre geçirip filtreleme de yapabilirsiniz. Query komutunun ilk parametresi sql. Burada direk tümünü listele dediğimiz için tek sql de işimizi görüyor. Filtreleme örneğine Get fonksiyonunu verebilirim. Burada int tipinde Id geçiriyoruz aslında yaptığımız direk id yi gönderip ilgili kaydı bulmak. Bu işlemden dönen değer tek bir kayıt olacağı için Query methodunun sonuna SingleOrDefault ekledik ki bize ya dönen kaydı yada null referansını dönersin (default keyword bir nesne için null döndürürken primitive olarak kabul edilen varsayılan değeri olan örneğin integer bir değişkeni 0 olarak oluşturur). Biz null mu değilmi sonradan kontrol edeceğiz. EF de de aynı işlemi yapmaktaydık veyahut signle çekip try de işimizi halletmekteydik. Her ne ise aynı şartlar bunda da geçerli. Ancak Insert ve update işlemleri Query komutuyla değil Execute komutu ile çalışır ve geriye int tipinde etkilenen kayıt sayısını döndürür. Buradan da kaydın güncellenip güncellenmediğini öğrenebilir. Ben hata kontrolü yapmıyorum ama sizin yapmanız çok mühim try siz kod kod değildir 🙂

Gelelim programımıza hemen bir switch-case oluşturup durumsal yönetim yapalım.

2016-11-14 00_36_26-DapperSample

Böyle de bir case yapımız olmuş oldu. Burada listeleyip istersek kayıtların numarasını verip düzenleyebiliyoruz.

2016-11-14 00_46_45-Başlangıç

2016-11-14 00_47_15-Başlangıç

Evet artık kayıt girip listelediğimiz de çalıştığını görebiliyoruz. Projenin kodları olsa ne güzel olurdu diyeceğinizi düşündüğüm için github da yayınladım. Adresi https://github.com/halityurttas/dappersample buradan tüm kodları ve veritabanını görebilirsiniz.

Bu yazı 6345 defa görüntülendi

“Dapper .Net için Micro ORM” için 2 cevap

  1. serkan dedi ki:

    selamlar,
    Bu Dapper ile ilgili yardıma ihtiyacım var 🙂
    Bire çok ilişkili tablomu insert ve update etmek istiyorum.
    Satırları tek tek değil , topku olarak göndereceğim.
    Bununla ilgili bir örneğiniz var mı acaba?

    • Halit Yurttaş dedi ki:

      Merhaba, dapper bu konuda malesef yeterli bir araç değil. En temizi normal bir orm kullanmanız. Ancak dapper üzerinde birden çok resultset çalıştırmanız mümkün ve bunları ilişkili olarak yürütmekte. Yalnız istediğiniz şey bulk operasyon ise malesef bunu da yapmanız mümkün olmayacaktır. Dapper aslında connection üzerinde command nesnesini çalıştırmakta, bu bağlamda yazacağınız sql in de native olarak bulk inserte uygun oluyor ise bunu başarabilirsiniz. EMail üzerinden iletişime geçerseniz size yardımcı olabilirim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Yazar Hakkında

15 yıllık çalışma hayatında birçok proje geliştirmiş binlerce projeyi inceleme fırsatı bulmuş yazılım aşığıdır. İşini hobi olarak gören yazarımız iş hayatını profesyonelce zevkle sürdürmektedir.

Son Eklenenler