Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Dapper Nedir? ADO.NET'in Üzerindeki İnce Katman ve İlk Sorgu
Dapper'ı ADO.NET üzerine eklenen extension method'lar olarak tanıyoruz: micro-ORM ne demek, EF Core ile ne zaman hangisi, .NET 10 + Dapper 2.1.89 + SQLite kurulumu, ilk Query ve 1.x'ten Dapper.AOT'ye kısa tarihçe.
Dapper ile Query ve Mapping: Kolonlar Property'lere Nasıl Eşlenir?
Query<T>'nin kolonları property'lere nasıl eşlediğini görüyoruz: büyük-küçük harf duyarsız eşleme, sessizce atlanan kolonlar, NULL ve varsayılan değerler, MatchNamesWithUnderscores ve önbellek tuzağı, dynamic sonuçlar, record'larda constructor eşlemesi.
Dapper ile Tek Satır Sorguları: QueryFirst, QuerySingle ve ExecuteScalar
QueryFirst, QueryFirstOrDefault, QuerySingle ve QuerySingleOrDefault'u sıfır, bir ve çok satırla yan yana çalıştırıp hangi exception'ı ne zaman fırlattıklarını görüyoruz; default(T), nullable tipler ve ExecuteScalar<T> tuzaklarıyla.
Dapper ile Parameter'lar ve SQL Injection: Güvenli Sorgunun Kuralları
String birleştirmenin neden SQL injection'a kapı açtığını gerçek bir saldırıyla görüyor, ardından anonymous object, DynamicParameters, IN @Ids liste genişletme, DbString ve $ önekini inceliyoruz; ORDER BY @Column gibi sessiz tuzaklarla.
Dapper Execute ile INSERT, UPDATE, DELETE: Etkilenen Satırlar ve Yeni Id
Execute ile INSERT, UPDATE ve DELETE çalıştırıp etkilenen satır sayısını okuyor, yeni id'yi RETURNING ve last_insert_rowid() ile alıyoruz; SQL Server OUTPUT ve PostgreSQL RETURNING farkına bakıp listeyle Execute'un neden bulk olmadığını ölçüyoruz.
Dapper ile Async ve Connection Yönetimi: CancellationToken, Pooling ve DI
Dapper'da CancellationToken'ın neden yalnızca CommandDefinition ile gittiğini, SQLite'ta async'in aslında senkron çalıştığını, connection pooling'i, tek connection paylaşmanın neden patladığını ve ASP.NET Core'da connection factory desenini gerçek çıktılarla görüyoruz.
Dapper ile Transaction: BeginTransaction, Commit, Rollback ve TransactionScope
Yarım kalan bir siparişten yola çıkıp Dapper'da BeginTransaction, transaction: parametresi, commit ve dispose ile rollback'i kuruyoruz; parametreyi unutmanın SQLite'ta neden sessiz kaldığını, isolation level'ları ve TransactionScope'un async ve SQLite tuzaklarını gerçek çıktılarla görüyoruz.
Dapper ile Multi-Mapping ve splitOn: İlişkili Verileri Tek Sorguda Okumak
Dapper'da multi-mapping'in row'ları column dilimlerine nasıl böldüğünü, varsayılan splitOn = "Id" hatasını, özel ve virgüllü splitOn'u, 1-N için dictionary desenini ve LEFT JOIN'deki null davranışını görüyor; N+1 problemini JOIN ve IN @ids ile ölçerek çözüyoruz.
Dapper ile QueryMultiple ve GridReader: Tek Round Trip'te Birden Fazla Result Set
Dapper'da QueryMultiple ve GridReader ile tek command'dan birden fazla result set okuyoruz: grid'lerin neden sırayla ve bir kez okunduğunu, master-detail bir siparişi tek round trip'te yüklemeyi, iki result set'i bellekte birleştirmeyi, unbuffered grid tuzağını ve multi-mapping ile ne zaman hangisini seçeceğimizi gerçek çıktılarla görüyoruz.
Dapper ile Buffered ve Unbuffered Okuma: Büyük Result Set'leri Akıtmak
Dapper'da buffered ve unbuffered okumanın farkını ölçüyoruz: unbuffered sonucun her enumerate'te sorguyu yeniden çalıştırdığını, bir milyon row'da 191 MB'a karşı sıfıra yakın belleği, QueryUnbufferedAsync ile IAsyncEnumerable akışını, WithCancellation ile iptali ve dispose edilmiş connection tuzağını gerçek çıktılarla görüyoruz.
Dapper Type Handler'ları ve Özel Eşleme: Guid, DateTimeOffset ve CustomPropertyTypeMap
SQLite'ta Guid, DateTimeOffset ve TimeSpan okurken Dapper neden patlar? SqlMapper.TypeHandler<T> ile tercüman yazıyor, SetValue'nun neden çağrılmadığını kaynak koddan görüyor, DateOnly/TimeOnly'nin 2.1.86 hikâyesini ve CustomPropertyTypeMap ile kolon eşlemesini ele alıyoruz.
Dapper ile Stored Procedure: Output, Return Value ve 2.1.11'in Otomatik Algılama Tuzağı
SQLite'ta stored procedure olmadığı için docker'daki SQL Server'a geçiyoruz: CommandType.StoredProcedure, DynamicParameters ile output ve return value, SET NOCOUNT'un Execute'a etkisi, 2.1.11'den beri tek kelimelik command'ların procedure sanılması ve PostgreSQL'de function ile procedure farkı.