Neler yeni

Yazılım Forum

Tüm özelliklerimize erişmek için şimdi bize katılın. Kayıt olduktan ve giriş yaptıktan sonra konu oluşturabilecek, mevcut konulara yanıt gönderebilecek, itibar kazanabilecek, özel mesajlaşmaya erişebilecek ve çok daha fazlasını yapabileceksiniz! Bu hizmetlerimiz ise tamamen ücretsiz ve kurallara uyulduğu sürece sınırsızdır, o zaman ne bekliyorsunuz? Hadi, sizde aramıza katılın!

Dapper ile .NET Uygulamalarınızda Hızlı ve Esnek Veritabanı Erişimi

Giriş: Veritabanı Erişiminde Yeni Bir Soluk

Modern yazılım geliştirme süreçlerinde veritabanı etkileşimi, uygulamaların kalbinde yer alır. Performans, esneklik ve geliştirici deneyimi, veritabanı erişim katmanının seçiminde kritik rol oynar. .NET ekosisteminde Entity Framework (EF) gibi güçlü ORM'ler bulunsa da, bazen daha hafif, daha hızlı ve SQL üzerinde tam kontrol sağlayan çözümlere ihtiyaç duyulur. İşte tam bu noktada, Dapper sahneye çıkıyor. Dapper, Stack Overflow ekibi tarafından geliştirilmiş, performans odaklı bir mikro-ORM'dir. Temel amacı, saf ADO.NET'in esnekliğini ve hızını korurken, boilerplate kod miktarını azaltmak ve nesne eşlemesini (object mapping) kolaylaştırmaktır. Bu makale, Dapper'ı derinlemesine inceleyecek, temelden ileri seviyeye kadar kullanımını örneklerle açıklayacak ve projelerinizde neden tercih etmeniz gerektiğini gösterecektir.

Dapper Nedir?

Dapper, bir ORM'den çok bir nesne-ilişkisel eşleyici (object-relational mapper) yardımcısıdır. Yani, tam teşekküllü bir ORM gibi veritabanı şemasını yönetme, migrations (geçişler) yapma veya karmaşık sorguları otomatik oluşturma gibi özelliklere sahip değildir. Bunun yerine, ADO.NET'in üzerine inşa edilmiş bir eklenti (extension) seti olarak işlev görür. Yazdığınız SQL sorgularının sonuçlarını otomatik olarak .NET nesnelerinize eşler, böylece veritabanından veri okuma sürecini inanılmaz derecede hızlandırır ve basitleştirir. Dapper, SQL sorguları üzerinde tam kontrol sahibi olmanızı sağlarken, aynı zamanda nesne eşleme gibi sıkıcı görevleri sizin yerinize halleder. Bu sayede, performans kritik uygulamalarda veya mevcut karmaşık veritabanı şemalarıyla çalışırken büyük avantajlar sunar.

Neden Dapper Tercih Edilmeli? Avantajları

Dapper'ın popülaritesi, sunduğu bir dizi önemli avantaja dayanmaktadır:

  • Yüksek Performans: Dapper, ADO.NET'in saf performansına yakın bir hız sunar. Diğer tam teşekküllü ORM'lere kıyasla daha az overhead (iş yükü) barındırır, çünkü çok daha hafif bir katmana sahiptir. Bu, özellikle veri yoğun uygulamalarda veya yüksek trafikli sistemlerde kritik bir faktördür.
  • Sadelik ve Öğrenme Kolaylığı: Dapper'ın API'si oldukça basittir ve öğrenmesi kolaydır. Temel metotlar (Query, Execute, QuerySingle, vb.) ile kısa sürede veritabanı işlemlerinizi gerçekleştirmeye başlayabilirsiniz.
  • SQL Üzerinde Tam Kontrol: Dapper, kendi SQL sorgularınızı yazmanıza olanak tanır. Bu, karmaşık sorguları optimize etme, veritabanına özgü fonksiyonları kullanma veya legacy sistemlerle entegre olma gibi durumlarda paha biçilmez bir esneklik sağlar.
  • Hafiflik: Dapper, tek bir .NET Standard kütüphanesi olarak dağıtılır ve çok az bağımlılığa sahiptir. Bu, uygulamanızın boyutunu küçük tutar ve başlangıç süresini olumsuz etkilemez.
  • Çoklu Veritabanı Desteği: Dapper, ADO.NET sağlayıcıları (provider) üzerinden çalıştığı için, SQL Server, MySQL, PostgreSQL, Oracle, SQLite gibi ADO.NET uyumlu her türlü veritabanı ile kullanılabilir.
  • Esneklik: Dapper, anonim tipleri, dinamik nesneleri ve güçlü tipleri destekler. Ayrıca, çoklu sonuç kümelerini (multiple result sets) ve çoklu nesne eşlemeyi (multi-mapping) kolayca yönetebilir.

Dapper Kurulumu ve Temel Kullanım

Dapper'ı projenize dahil etmek oldukça basittir. NuGet paket yöneticisi aracılığıyla projenize ekleyebilirsiniz.

Kod:
Install-Package Dapper

Dapper'ı kullanmak için öncelikle bir veritabanı bağlantısına ihtiyacınız vardır. Bu genellikle `IDbConnection` arayüzü üzerinden sağlanır. Örneğin, SQL Server için `SqlConnection` sınıfını kullanabilirsiniz.

1. Veri Okuma (SELECT İşlemleri)

Dapper'ın temel gücü, SQL sorgularının sonuçlarını C# nesnelerine hızlıca eşlemesidir. `Query<T>` metodu, bir koleksiyon döndürmek için kullanılırken, `QuerySingle<T>` veya `QueryFirstOrDefault<T>` tek bir nesne almak için kullanılır.

Kod:
public class Urun
{
    public int Id { get; set; }
    public string Ad { get; set; }
    public decimal Fiyat { get; set; }
    public int StokAdedi { get; set; }
}

// ...

using (var connection = new SqlConnection("YourConnectionString"))
{
    connection.Open();

    // Tüm ürünleri çekme
    var urunler = connection.Query<Urun>("SELECT Id, Ad, Fiyat, StokAdedi FROM Urunler").ToList();
    foreach (var urun in urunler)
    {
        Console.WriteLine($"ID: {urun.Id}, Ad: {urun.Ad}, Fiyat: {urun.Fiyat:C}, Stok: {urun.StokAdedi}");
    }

    // Belirli bir ID'ye sahip ürünü çekme
    int urunId = 1;
    var tekUrun = connection.QueryFirstOrDefault<Urun>("SELECT Id, Ad, Fiyat, StokAdedi FROM Urunler WHERE Id = @Id", new { Id = urunId });
    if (tekUrun != null)
    {
        Console.WriteLine($"Tek Ürün: {tekUrun.Ad}, Fiyat: {tekUrun.Fiyat:C}");
    }
}

Yukarıdaki örnekte `@Id` parametresi, SQL enjeksiyonuna karşı güvenli bir şekilde parametreli sorgu kullanmayı gösterir. Dapper, parametreleri anonim bir nesne olarak veya `DynamicParameters` sınıfı aracılığıyla kabul edebilir.

2. Veri Yazma (INSERT, UPDATE, DELETE İşlemleri)

Veritabanına veri eklemek, güncellemek veya silmek için `Execute` metodunu kullanırız. Bu metot, etkilenen satır sayısını döndürür.

Kod:
using (var connection = new SqlConnection("YourConnectionString"))
{
    connection.Open();

    // INSERT işlemi
    var yeniUrun = new Urun { Ad = "Yeni Laptop", Fiyat = 12500.00M, StokAdedi = 50 };
    var affectedRows = connection.Execute("INSERT INTO Urunler (Ad, Fiyat, StokAdedi) VALUES (@Ad, @Fiyat, @StokAdedi)", yeniUrun);
    Console.WriteLine($"Eklenen satır sayısı: {affectedRows}");

    // UPDATE işlemi
    var guncellenecekUrun = new Urun { Id = 3, Ad = "Güncellenmiş Klavye", Fiyat = 450.00M, StokAdedi = 120 };
    affectedRows = connection.Execute("UPDATE Urunler SET Ad = @Ad, Fiyat = @Fiyat, StokAdedi = @StokAdedi WHERE Id = @Id", guncellenecekUrun);
    Console.WriteLine($"Güncellenen satır sayısı: {affectedRows}");

    // DELETE işlemi
    int silinecekUrunId = 2;
    affectedRows = connection.Execute("DELETE FROM Urunler WHERE Id = @Id", new { Id = silinecekUrunId });
    Console.WriteLine($"Silinen satır sayısı: {affectedRows}");
}

Gelişmiş Dapper Özellikleri

1. Çoklu Nesne Eşleme (Multi-Mapping)

Bir sorgunun birden fazla nesne türünü döndürdüğü senaryolarda Dapper'ın `Query<T1, T2, TReturn>` metodu devreye girer. Bu genellikle bir ana-detay ilişkisinde (örneğin, Sipariş ve Sipariş Kalemleri) kullanılır.

Kod:
public class Siparis
{
    public int Id { get; set; }
    public DateTime SiparisTarihi { get; set; }
    public List<SiparisKalemi> Kalemler { get; set; } = new List<SiparisKalemi>();
}

public class SiparisKalemi
{
    public int Id { get; set; }
    public int SiparisId { get; set; }
    public string UrunAdi { get; set; }
    public int Miktar { get; set; }
    public decimal BirimFiyat { get; set; }
}

// ...

using (var connection = new SqlConnection("YourConnectionString"))
{
    connection.Open();

    string sql = "SELECT s.Id, s.SiparisTarihi, sk.Id, sk.SiparisId, sk.UrunAdi, sk.Miktar, sk.BirimFiyat " +
                 "FROM Siparisler s INNER JOIN SiparisKalemleri sk ON s.Id = sk.SiparisId";

    var siparisDictionary = new Dictionary<int, Siparis>();

    var siparisler = connection.Query<Siparis, SiparisKalemi, Siparis>(sql,
        (siparis, kalem) =>
        {
            if (!siparisDictionary.TryGetValue(siparis.Id, out var existingSiparis))
            {
                existingSiparis = siparis;
                siparisDictionary.Add(existingSiparis.Id, existingSiparis);
            }
            existingSiparis.Kalemler.Add(kalem);
            return existingSiparis;
        },
        splitOn: "Id") // SQL sorgusundaki ikinci ID kolonu (SiparisKalemi'nin Id'si) bu ayırma noktasını belirtir.
        .Distinct()
        .ToList();

    foreach (var siparis in siparisler)
    {
        Console.WriteLine($"Sipariş ID: {siparis.Id}, Tarih: {siparis.SiparisTarihi.ToShortDateString()}");
        foreach (var kalem in siparis.Kalemler)
        {
            Console.WriteLine($"  - Kalem: {kalem.UrunAdi}, Miktar: {kalem.Miktar}, Fiyat: {kalem.BirimFiyat:C}");
        }
    }
}

2. Saklı Yordamlar (Stored Procedures)

Dapper, saklı yordamları da kolayca çağırabilir. Parametreleri ve dönüş değerlerini yönetmek, doğrudan SQL sorgularındaki gibi yapılır.

Kod:
using (var connection = new SqlConnection("YourConnectionString"))
{
    connection.Open();

    // Saklı yordamdan veri okuma
    var products = connection.Query<Urun>("GetProductsByStock",
                                         new { MinStock = 100 },
                                         commandType: CommandType.StoredProcedure).ToList();

    foreach (var product in products)
    {
        Console.WriteLine($"SP'den gelen ürün: {product.Ad}, Stok: {product.StokAdedi}");
    }

    // Saklı yordam ile veri güncelleme ve OUTPUT parametresi alma
    var parameters = new DynamicParameters();
    parameters.Add("@UrunId", 1);
    parameters.Add("@YeniFiyat", 550.00M);
    parameters.Add("@EtkilenenSatirSayisi", dbType: DbType.Int32, direction: ParameterDirection.Output);

    connection.Execute("UpdateProductPrice", parameters, commandType: CommandType.StoredProcedure);

    int etkilenenSatirSayisi = parameters.Get<int>("@EtkilenenSatirSayisi");
    Console.WriteLine($"Fiyat güncellemesi sonucunda etkilenen satır sayısı: {etkilenenSatirSayisi}");
}

3. İşlemler (Transactions)

Veritabanı işlemlerinde atomikliği (bütünlüğü) sağlamak için transaction'lar kullanılır. Dapper, ADO.NET'in transaction mekanizmasıyla sorunsuz bir şekilde entegre olur.

Kod:
using (var connection = new SqlConnection("YourConnectionString"))
{
    connection.Open();
    using (var transaction = connection.BeginTransaction())
    {
        try
        {
            // İlk işlem: Ürün stok güncelleme
            connection.Execute("UPDATE Urunler SET StokAdedi = StokAdedi - @Miktar WHERE Id = @Id", new { Id = 1, Miktar = 5 }, transaction: transaction);

            // İkinci işlem: Sipariş kalemi ekleme
            connection.Execute("INSERT INTO SiparisKalemleri (SiparisId, UrunAdi, Miktar, BirimFiyat) VALUES (@SiparisId, @UrunAdi, @Miktar, @BirimFiyat)",
                               new { SiparisId = 101, UrunAdi = "Klavye", Miktar = 5, BirimFiyat = 500.00M }, transaction: transaction);

            transaction.Commit();
            Console.WriteLine("İşlem başarıyla tamamlandı.");
        }
        catch (Exception ex)
        {
            transaction.Rollback();
            Console.WriteLine($"İşlem geri alındı: {ex.Message}");
        }
    }
}

4. Asenkron İşlemler

Modern uygulamalarda tepkiselliği artırmak için asenkron programlama vazgeçilmezdir. Dapper, `QueryAsync`, `ExecuteAsync` gibi metotlarla asenkron işlemleri destekler.

Kod:
public async Task<List<Urun>> GetTumUrunlerAsync(string connectionString)
{
    using (var connection = new SqlConnection(connectionString))
    {
        await connection.OpenAsync();
        var urunler = await connection.QueryAsync<Urun>("SELECT Id, Ad, Fiyat, StokAdedi FROM Urunler");
        return urunler.ToList();
    }
}

// ... kullanım örneği
// var tumUrunler = await GetTumUrunlerAsync("YourConnectionString");

Performans İpuçları ve En İyi Uygulamalar

  • Bağlantı Havuzu (Connection Pooling) Kullanın: ADO.NET bağlantı havuzlama özelliğini etkinleştirin. Bu, bağlantı açma/kapama maliyetini düşürerek performansı artırır. Bağlantı dizenizde `Pooling=true;` (varsayılan olarak true'dur) olduğundan emin olun.
  • Sorguları Optimize Edin: Dapper size SQL üzerinde tam kontrol verdiğinden, sorgularınızın verimli olduğundan emin olmak sizin sorumluluğunuzdadır. İndeksleri doğru kullanın, gereksiz kolonları çekmeyin.
  • Parametreli Sorgular Kullanın: Her zaman parametreli sorgular kullanarak SQL enjeksiyon saldırılarına karşı koruma sağlayın ve sorgu planlarının önbelleğe alınmasına yardımcı olun.
  • Doğru Dapper Metodunu Seçin: Tek bir satır bekliyorsanız `QuerySingle<T>` veya `QueryFirstOrDefault<T>`, birden çok satır bekliyorsanız `Query<T>` kullanın. Sadece etkilenen satır sayısını öğrenmek için `Execute` kullanın.
  • IDisposable'ı Doğru Yönetin: `IDbConnection` ve `IDbTransaction` nesnelerini `using` blokları içinde kullanarak kaynakların düzgün bir şekilde serbest bırakılmasını sağlayın.
  • Dönüş Tiplerini Belirleyin: Dapper dinamik nesnelerle de çalışabilse de, performansı artırmak ve derleme zamanı güvenliği sağlamak için açıkça tipli (strongly typed) nesneler kullanmak genellikle daha iyidir.
  • Veritabanı İşlemlerini Asenkron Yapın: Özellikle web uygulamaları veya UI uygulamalarında, veritabanı işlemlerini asenkron olarak gerçekleştirerek uygulamanın kilitlenmesini önleyin ve kullanıcı deneyimini iyileştirin.

Dapper ve Diğer ORM'ler: Ne Zaman Hangisi?

Her aracın kendi güçlü ve zayıf yönleri vardır. Önemli olan, projenizin gereksinimlerine en uygun aracı seçmektir.

* Entity Framework (EF Core): Veritabanı şema yönetimi, karmaşık nesne grafikleri, LINQ sorguları ve az miktarda SQL bilgisi gerektiren durumlar için idealdir. Büyük projelerde veya geliştirme hızının öncelikli olduğu yerlerde tercih edilebilir. Ancak, Dapper'a kıyasla daha fazla performans overhead'i vardır ve SQL üzerinde daha az kontrol sağlar.
* Dapper: Yüksek performansın kritik olduğu, SQL üzerinde tam kontrol istenen, mevcut veritabanı şemalarıyla çalışılan veya mikro servisler gibi hafif uygulamalar için mükemmeldir. Yeni bir veritabanı oluşturmak yerine mevcut bir veritabanıyla entegre olurken veya karmaşık, optimize edilmiş SQL sorgularına ihtiyaç duyulduğunda parlar. Dapper, EF Core ile birlikte bir projede kullanılabilir; örneğin, EF Core ile genel CRUD işlemleri yapılırken, performans kritik raporlama veya toplu işlemler için Dapper kullanılabilir.

Sonuç

Dapper, .NET geliştiricileri için veritabanı erişimini basitleştiren, hızlandıran ve SQL üzerinde tam kontrol sağlayan güçlü bir mikro-ORM'dir. Yüksek performans, esneklik ve sadelik arayan projeler için mükemmel bir seçimdir. Bu makalede ele alınan temel ve ileri düzey özelliklerle, Dapper'ı projelerinize dahil etmek için gerekli bilgi birikimine sahip olursunuz. Unutmayın, doğru aracı doğru yerde kullanmak, başarılı bir yazılım geliştirme sürecinin anahtarıdır.

Daha fazla bilgi ve örnek için Dapper'ın GitHub deposunu ziyaret edebilirsiniz: Dapper GitHub Deposu

Umarım bu kapsamlı rehber, Dapper ile veritabanı erişimini hızlandırma ve optimize etme yolculuğunuzda size yardımcı olur. Başarılar dilerim!

Yazan: [Sizin Adınız/Kullanıcı Adınız]
 
shape1
shape2
shape3
shape4
shape5
shape6
Üst

Bu web sitenin performansı Hazal Host tarafından sağlanmaktadır.

YazilimForum.com.tr internet sitesi, 5651 sayılı Kanun’un 2. maddesinin 1. fıkrasının (m) bendi ve aynı Kanun’un 5. maddesi kapsamında Yer Sağlayıcı konumundadır. Sitede yer alan içerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır.

YazilimForum.com.tr, kullanıcılar tarafından paylaşılan içeriklerin doğruluğunu, güncelliğini veya hukuka uygunluğunu garanti etmez ve içeriklerin kontrolü veya araştırılması ile yükümlü değildir. Kullanıcılar, paylaştıkları içeriklerden tamamen kendileri sorumludur.

Hukuka aykırı içerikleri fark ettiğinizde lütfen bize bildirin: lydexcoding@gmail.com

Sitemiz, kullanıcıların paylaştığı içerik ve bilgileri 6698 sayılı KVKK kapsamında işlemektedir. Kullanıcılar, kişisel verileriyle ilgili haklarını KVKK Politikası sayfasından inceleyebilir.

Sitede yer alan reklamlar veya üçüncü taraf bağlantılar için YazilimForum.com.tr herhangi bir sorumluluk kabul etmez.

Sitemizi kullanarak Forum Kuralları’nı kabul etmiş sayılırsınız.

DMCA.com Protection Status Copyrighted.com Registered & Protected