ekrem özer

her yerde olan şeyler.

Linq To SQL İle Veritabanı İşlemleri

LINQ teriminin kelime anlamı Language Integrated Query yani dil ile bütünleştirilmiş sorgu. Veritabanı işlemleri için SQL kullanıyorduk. Linq ile artık bu sorgulama işlemleri için ayrı bir dil kullanmamıza gerek kalmıyor. Veritabanı üzerinde ekleme, silme ve güncelleme gibi işlemleri Linq ile gerçekleştirebiliyoruz. Linq To Sql ile .NET sınıflarını kullanarak ilişkisel veritabanı modeli oluşturulur.

Linq To Sql veritabanı içerisindeki transaction, view ve stored procedure'leri destekler. Veritabanı içerisindeki bu tür nesneler .NET nesnelerine dönüştürülerek üzerinde kolayca işlerler gerçekleştirilir. Linq To Sql yapısını anlatırken örneğimizde modelleme yaklaşımı olarak Database First yaklaşımını kullanacağız. Konu anlatımı için örneğimizde basit bir ziyaretçi defteri uygulaması hazırlayacağız. Uygulamamızda mesajların yazıldığı, okunduğu ve yönetici tarafından silme, düzenleme ve onaylama işlemlerinin yapıldığı sayfalar olacak.  Veritabanımızda ise mesajlarımızın tutulduğu bir tablo olacak.

Öncelikle boş bir MVC Razor projesi oluşturuyoruz. Ardından veritabanızımı oluşturacağız. View>Server Explorer(Crtl+Alt+S) adımları ile Server Explorer'ı açıyoruz. Connetct to Database butonuna tıklıyoruz. Ardından açılan pencereye veritabanımızın adını giriyoruz ve OK butonuna basıyoruz. Veritabanı oluşturmak istediğinizden emin misiniz? Şeklinde bir uyarı gelecek OK dedikten sonra veritabanımız oluşacaktır. Data Connections altında veritabanımızı göreceksiniz.

Şimdi sağ tık Add New Table diyerek tablolarımızı oluşturalım. Tablomuzu aşağıdaki şekilde oluşturuyoruz. ID alanını Primary Key olarak atıyoruz ve özelliklerinden Identity durumunu aktif hale getiriyoruz. Artık ID alanı birincil ve otomatik artan durumunda oluyor. Veritabanımızı oluşturduktan sonra kaydetmek için projemizi build etmemiz yeterli. Veritabanımızın son hali aşağıdaki gibidir.

Sonra açılan pencereye Server Explorerden oluşturduğumuz tabloyu sürükleyip bırakıyouruz. Son olarakta kaydettikten sonra pencereyi kapatıyoruz. Models klasörümüzün içerisinde öncelikle veritabanı işlemlerini gerçekleştireceğimiz bir class oluşturuyoruz. Sınıfımızda öncelikle DataContext'imizi global değişken olarak oluşturuyoruz. Linq To Sql'de modelimizi oluştururken DataContext'imizde otomatik olarak oluşmuştur. Modelimize verdiğimiz adın sonuna DataContext ekleyerek görebiliriz. ModelClass.cs adlı class'ıma DataContextimi global bir değişken olarak tanımlıyorum. DataContext modelimize bağlanmamızı sağlıyor. Linq To Sql modelimizi oluştururken DataContext'imizde otomatik olarak oluşmuştur.

Modelinize verdiğinzi adın sonuda DataContext ekleyerek görebilirsiniz.

ModelDataContext db = new ModelDataContext();

Şimdi classımıza ekleme, listemele ve silme metotlarını oluşturacağız. Fakat bu metotlar, deişiklikleri model üzerinde yapmaktadır. Bu işlemlerin veritabanında kalıcı şekilde değişmesi için birde Kaydet isminde bir motot oluşturacağız. Dikkat ederseniz güncelleme metodundan bahsetmedik. Güncelleme işlemleri Controller içirisinde yapılabilmektedir. Ekleme Metodu

public void MesajEkle(tblMesajlar mesaj)
{
    db.tblMesajlars.InsertOnSubmit(mesaj);
}

Liteleme Metodu

public List<tblMesajlar> MesajListele(bool onay)
{
    if (onay)
        return db.tblMesajlars.Where(x => x.Onay == true).ToList();
    else
        return db.tblMesajlars.ToList();
}

Listeleme işleminde sadece onaylanmış mesajları listemelek için true bir parametle göndermeliyiz. Parametreyi false olarak gönderirsek tüm kayıtlar gelecektir. Silme Metodu

public void MesajSil(tblMesajlar mesaj)
{
    db.tblMesajlars.DeleteOnSubmit(mesaj);
}

Kaydetme Metodu

public void Kaydet()
{
    db.SubmitChanges();
}

Şimdi sıra Controller ve View'lerin oluşturulmasında. Öncelikle MesajController adında bir controller oluşturuyoruz. Controller klasörüme gelip sağ tık Add>New Controller e tıklıyorum ve MesajController adında bir controller oluşturuyorum. Şimdi okuma ve mesaj ekleme sayfalarını yazalım. Fakat öncelikle veritabanı işlemlerini yazdığımız sınıfı oluşturmamız gerek.

Bu sınıf Controller içerisinde direkt gözükmeyecek, sebebi ise farklı bir namespace içerisinde olmasıdır. Bu yüzden önce namespaceimizi ekliyoruz. İlgili namespaceimiz ProjeAdı.Models şeklindedir.

using LinqToSqlDatabaseFirst.Models;

Global bir değişken olarak Models klasörünün içerisine yazdığımız veritabanı işlemlerini gerçekleştiren sınıftan bir nesne oluşturalım.

ModelClass dbMesajlar = new ModelClass();

Şimdi listeleme işlemini yapan ActionResult'ımızı yazalım.

public ActionResult MesajOku()
{
    return View(dbMesajlar.MesajListele(true));
}

MesajOku isminde ActionResult'ımızı oluşturduk ve bize true olarak parametre gönderdiğimiz için sadece onaylanan mesajları döndürecek. Şimdi bu ActionResult'ımıza View ekliyelim. ActionResult üzerine sağ tık Add View diyoruz. Açılan pencerede aşağıdaki şekilde ayarlarımızı yapıyoruz. Create a strongly-typed view seçeneğini işaretliyoruz. Model Class olarakta tblMesaj'ı seçiyoruz. Scaffold template olarakta listeleme işlemi yapacağımız için List seçeneğini seçiyoruz. Bu projede Layout kullanamdığım için bir şey seçmiyorum. Siz kendi projelerinizde Layout kullanacaksanız seçim yapıp Add demelisiniz.

View sayfamız otomatik olarak oluşacaktır. Herhangi bir değişiklik yapmamıza gerek yok. Şimdi mesaj ekleme işlemini yapalım. Mesaj ekleme kısmında iki aşama olacak. Birinci aşamada sayfanın ilk açılışında sadece form gözükecektir. İkinci aşamada isegirilen bilgilerin kaydedilmesi için butona basılacak işlemler yer alacaktır. Yani post işlemince çalışacak Action. Önce veri ekleme için View'imizi oluşturalım. fakat bu iş bizim için otomatik olarak yapılacaktır. ActionResult'ımzı yazdıktan sonra View'imizi ekleyeceğiz bu sefer ViewTemplate olarak Create'i seçeceğiz.

public ActionResult MesajYaz()
{ 
    return View(); 
}

Formumuz yine otomatik olarak oluştur. Buradan tarihi ve onayı siliyoruz çünkü bu kısımları arka taraftan gireceğiz. Son olarakta mesaj giriş alanını TextAreaya çeviriyorum ve legend ile butonun textini değiştiriyorum.

@Html.TextAreaFor(model => model.Mesaj)

Bu aşamada butona bastığımızda bir işlem olmayacaktır çünkü post işlemi içinde bir ActionResult yazmamız gerekmektedir. ActionResult'ımızın adı View'ı oluşturan ActionResult ile aynı olmalı veya View içerisinde form satırında post edilecek Controller ve Action belirtilmelidir. Belirtmezsek default olarak Aynı isimdeki ActionResulta gidecektir. Post işleminde gerçekleşecek ActionResultımızı belirtirken ActionResult'ın üst satırına [HttpPost] yazmalıyız. Mesaj ekleme ActionResult'ımız

[HttpPost]
public ActionResult MesajYaz(tblMesajlar yeniMesaj)
{
    tblMesajlar mesaj = new tblMesajlar();
    mesaj.Yazar = yeniMesaj.Yazar;
    mesaj.Konu = yeniMesaj.Konu;
    mesaj.EPosta = yeniMesaj.EPosta;
    mesaj.Mesaj = yeniMesaj.Mesaj;
    mesaj.Onay = false;
    mesaj.Tarih = DateTime.Now;
    dbMesajlar.MesajEkle(mesaj);
    dbMesajlar.Kaydet();
    return View();
}

Yukarıdaki kodu inceleyecek olursak MesajYaz ActionResult'ımız tblMesajlar türünden yeniMesaj adına bir değer alıyor. Kod bloğu içerisinde de tblMesajlar türünden mesaj adında bir nesne oluşturuyorum. Sonra bu mesaj nesnesinin elemanlarına post işlemiyle gelen yeniMesajın elemanlarını yazıyorum son olarakta oluşturduğumum classıda MesajEkle metodunu çağırarak oluşturduğum mesaj elemanını gönderiyorum.

Bir alt satırda ise aynı classın kaydet metodunu çağırarak mesajımı kaydediyorum. Şimdi uygulamamıza mesajların onaylanacağı sayfayı yapalım. Sayfamızda mesajlar listelenecek ve her mesajın yanında link bulunacak. Bu linke tıklandığında mesaj onaylı ise onayı kaldırılacak, onaylı değil ise onaylanacak. Öncelikle daha önce yaptığımız gibi listeleme işlemi yapıp viewımızı oluşturuyoruz. ActionResult'ımız

public ActionResult MesajOnayla()
{
    return View(dbMesajlar.MesajListele(false));
}

Fakat view sayfamıza bir kısım değişiklikler olacak. Öncelikle başlıklara Onayla/Onay Kaldır adı bir başlık ekliyoruz ardından bu işlemi yapacak linkimizi ekliyoruz.

@Html.ActionLink("İşlemi Yap", "OnayIslemi", new { Id = item.ID, onayDurum = (item.Onay == false) ? true : false })

ActionLinkimizi inceleyecek olursak: Text:İşlemi Yap ActionResult:OnayIslemi Parametreler: ID kaydın ID'si, onayDurum ise kaydın onay durumu false ise true, true ise false değerini alıyor. Sebebide belirttiğimiz gibi onaylı ise onay kaldıracak, onaylı değilse onaylayacak. Son olarak Onaylama işlemini yapan ActionResult'ımızı yazalım.

public ActionResult OnayIslemi(int ID, bool onayDurum)
{
    tblMesajlar mesaj = new tblMesajlar();
    mesaj = dbMesajlar.MesajListele(false).Where(x => x.ID == ID).SingleOrDefault();
    mesaj.Onay = onayDurum;
    UpdateModel(mesaj);
    dbMesajlar.Kaydet();
    return View("MesajOnayla", dbMesajlar.MesajListele(false));
}

Yukarıdaki kodu inceleyecek olursak ilk olarak ActionResult'ımız ID ve onayDurum olarak gönderdiğimiz iki parametreyi alıyor. tblMesaj türünden oluşturuğumuz mesaj nesnesine where koşulu ile gönderdiğimiz ID ye ait mesajı atıyoruz. Sonra mesaj.Onay=onayDurum ilede bize gelen onayDurum parametresini mesaja atıyoruz ve UpdateModel ilede kaydımızı güncelliyoruz.

Son olarakta return ile onay sayfamızı tekrar döndürüyoruz. Bu yazımızda Linq To SQL İle Veritabanı İşlemlerini basit bir uygulama ile anlatmış olduk, umarım faydalı olmuştur. İndireceğiniz projede bir kaç değişiklik yaptım, tablolara border vermek, view oluşturma ile gelen add/edit/delete/crate linkerini silmek vs. gibi. Projeyi indirmek için tıklayınız.