İçeriğe geç

Entity Framework ile ASP.NET MVC: Veritabanı İşlemlerinin Temelleri




ASP.NET MVC ve Entity Framework Code First ile Veritabanı İşlemleri

Modern web uygulamaları geliştirmek, verilerin verimli bir şekilde yönetilmesini gerektirir. ASP.NET MVC, bu süreçte güçlü bir altyapı sunarken, Entity Framework (EF) ise veri erişim katmanını soyutlayarak geliştiricilerin işini önemli ölçüde kolaylaştırır. Özellikle Code First yaklaşımı, veritabanı şemasını C# sınıfları (modeller) üzerinden oluşturarak, geliştiricilerin SQL komutları yazmak yerine nesne yönelimli programlama prensiplerine odaklanmasını sağlar. Bu yazı, Entity Framework Code First yaklaşımını kullanarak bir ASP.NET MVC uygulamasında veritabanı işlemlerinin nasıl gerçekleştirileceğini adım adım ele alacaktır. DbContext sınıfının rolü, temel CRUD (Create, Read, Update, Delete) operasyonlarının uygulanması ve verileri sorgulamak için LINQ’nun nasıl kullanılacağı detaylı bir şekilde incelenecektir.

Model ve DbContext sınıflarının oluşturulması

Entity Framework Code First yaklaşımının temeli, veritabanı tablolarını temsil eden C# sınıfları olan “Model” veya “Entity” sınıflarına dayanır. Bu sınıflar, POCO (Plain Old CLR Object) olarak adlandırılır ve veritabanındaki tablonun sütunlarına karşılık gelen özellikler içerirler. Örneğin, bir ürünler tablosunu yönetmek için aşağıdaki gibi bir Product sınıfı oluşturulabilir:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

Bu model sınıfı oluşturulduktan sonra, veritabanı ile uygulama arasındaki köprüyü kuracak olan DbContext sınıfı tanımlanmalıdır. Bu sınıf, System.Data.Entity.DbContext sınıfından miras alır ve veritabanı bağlantısını, sorguları ve değişiklik takibini yönetir. İçerisinde, her bir model için bir DbSet özelliği tanımlanır. Bu DbSet, ilgili tablodaki tüm kayıtları temsil eden bir koleksiyon görevi görür.

public class ApplicationDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

Entity Framework, bu ApplicationDbContext sınıfını kullanarak Web.config dosyasındaki bağlantı dizesi (connection string) üzerinden veritabanını otomatik olarak oluşturur veya mevcut veritabanına bağlanır.

CRUD işlemleri: Veri ekleme ve okuma (Create & Read)

Model ve DbContext sınıfları hazırlandıktan sonra, veritabanına veri ekleme ve mevcut verileri okuma işlemleri oldukça basittir. Bu işlemler genellikle Controller sınıfları içinde gerçekleştirilir.

Veri Ekleme (Create):

  • DbContext sınıfından bir örnek (instance) oluşturulur.
  • Eklenmek istenen veriyi taşıyan yeni bir model nesnesi (örneğin, new Product()) yaratılır.
  • Bu nesne, ilgili DbSet koleksiyonuna Add() metodu ile eklenir.
  • Son olarak, yapılan değişikliği veritabanına kalıcı olarak yansıtmak için SaveChanges() metodu çağrılır. Bu metod çağrılana kadar hiçbir SQL komutu çalıştırılmaz.

var db = new ApplicationDbContext();
var newProduct = new Product { Name = “Laptop”, Price = 25000 };
db.Products.Add(newProduct);
db.SaveChanges();

Veri Okuma (Read):

Verileri okumak için LINQ (Language Integrated Query) sorguları kullanılır. Bu sorgular, SQL’e benzer bir söz dizimiyle C# içinde yazılır ve Entity Framework tarafından veritabanının anlayacağı SQL sorgularına dönüştürülür.

  • Tüm kayıtları getirmek için: db.Products.ToList() metodu kullanılır. Bu, Products tablosundaki tüm ürünleri bir liste olarak döndürür.
  • Belirli bir kaydı getirmek için: Find() veya LINQ’nun FirstOrDefault() gibi metodları kullanılır. Find(id), birincil anahtara (primary key) göre arama yaparken, FirstOrDefault(p => p.Name == “Laptop”) gibi ifadelerle özel koşullara göre arama yapılabilir.

Veri güncelleme ve silme işlemleri (Update & Delete)

Mevcut verilerin güncellenmesi ve silinmesi de benzer bir mantıkla ilerler. Her iki işlem de öncelikle üzerinde çalışılacak kaydın veritabanından bulunmasını gerektirir.

Veri Güncelleme (Update):

Bir kaydı güncellemek için en yaygın yöntem, önce o kaydı veritabanından çekmek, özelliklerini değiştirmek ve ardından SaveChanges() metodunu çağırmaktır. Entity Framework’ün değişiklik izleme (change tracking) mekanizması sayesinde, bir nesnenin özellikleri değiştirildiğinde durumu otomatik olarak “Modified” (Değiştirildi) olarak işaretlenir.

  1. Güncellenecek kayıt, Find() veya başka bir LINQ sorgusu ile bulunur.
  2. Bulunan nesnenin özellikleri yeni değerlerle güncellenir.
  3. db.SaveChanges() çağrılarak değişiklikler veritabanına kaydedilir. Entity Framework, yalnızca değişen alanlar için bir SQL UPDATE komutu oluşturur.

var productToUpdate = db.Products.Find(1); // ID’si 1 olan ürünü bul
if (productToUpdate != null)
{
    productToUpdate.Price = 27500;
    db.SaveChanges();
}

Veri Silme (Delete):

Silme işlemi de güncellemeye benzer şekilde, önce silinecek kaydın bulunmasıyla başlar. Ardından bu nesne, ilgili DbSet üzerinden Remove() metoduna verilir ve değişiklikler SaveChanges() ile onaylanır.

var productToDelete = db.Products.Find(2); // ID’si 2 olan ürünü bul
if (productToDelete != null)
{
    db.Products.Remove(productToDelete);
    db.SaveChanges();
}

LINQ ile gelişmiş veri sorgulama

Entity Framework’ün gücü, karmaşık veri sorgularının LINQ kullanılarak kolayca yazılabilmesinden gelir. LINQ, geliştiricilere SQL’in karmaşıklığından uzak, güçlü ve tip güvenli (type-safe) bir sorgulama dili sunar. Temel okuma işlemlerinin ötesinde, verileri filtrelemek, sıralamak ve şekillendirmek için çeşitli LINQ metodları kullanılabilir.

LINQ Metodu Açıklama Örnek Kullanım
Where Belirli bir koşulu sağlayan kayıtları filtreler. db.Products.Where(p => p.Price > 10000).ToList();
OrderBy / OrderByDescending Kayıtları belirtilen bir özelliğe göre artan veya azalan sırada sıralar. db.Products.OrderBy(p => p.Name).ToList();
Select Veritabanından yalnızca belirli sütunları seçerek veriyi şekillendirir (projeksiyon). Bu, performansı artırır. db.Products.Select(p => new { ProductName = p.Name, ProductPrice = p.Price }).ToList();
Include İlişkili verileri (örneğin, bir ürünün kategorisi) tek bir sorguda yüklemek için kullanılır (Eager Loading). db.Products.Include(“Category”).ToList();

Bu metodlar birleştirilerek (chaining) çok daha karmaşık sorgular oluşturulabilir. Örneğin, fiyatı 5000’den yüksek olan ürünleri isme göre sıralayarak sadece isim ve fiyat bilgilerini getiren bir sorgu şu şekilde yazılabilir: db.Products.Where(p => p.Price > 5000).OrderBy(p => p.Name).Select(p => new { p.Name, p.Price }).ToList(); Bu ifade, Entity Framework tarafından optimize edilmiş tek bir SQL sorgusuna dönüştürülerek veritabanında çalıştırılır.

Özetle, ASP.NET MVC uygulamalarında Entity Framework Code First yaklaşımı, veri katmanı yönetimini kökten değiştiren bir metodolojidir. Geliştiriciler, veritabanı şemasını doğrudan C# sınıfları üzerinden tasarlayarak işe başlar ve DbContext sınıfı aracılığıyla veritabanıyla etkileşime girer. Bu yapı, veri ekleme, okuma, güncelleme ve silme (CRUD) gibi temel operasyonları Add, ToList, Find ve Remove gibi sezgisel metodlarla basitleştirir. Tüm bu değişikliklerin veritabanına yansıtılması ise tek bir SaveChanges() çağrısı ile gerçekleşir. LINQ entegrasyonu sayesinde, karmaşık SQL sorguları yazma ihtiyacı ortadan kalkar ve veriler tip güvenli, okunabilir C# ifadeleriyle sorgulanır. Bu yaklaşım, geliştirme sürecini hızlandırır, hata olasılığını azaltır ve daha sürdürülebilir bir kod tabanı oluşturur.


Resim Sahibi: Kevin Ku
https://www.pexels.com/@kevin-ku-92347

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir