Makale Özeti

Bu yazımızda MVC Framework 1.0 ile ADO.NET Entity Framework 'ü kullanarak temel veri tabanı işlemlerini yapabildiğimiz bir web sayfasını nasıl hazırlayabileceğimizi inceliyor olacağız.

Makale

Web uygulamalarının katmansal mimarisi olarak görülen Model View Controller yapısı 2008 yılının başlarında Microsoft tarafından MVC Framework olarak bizlere sunulacağı duyuruldu ve CTP sürümler ile nasıl kullanılacağı açıklanmaya çalışıldı. Bizlerde geçtiğimiz yıl içerisinde MVC Framework ile uygulama geliştirme nasıl olacak, hangi adımları izleyerek uygulama geliştireceğimizi anlatmaya çalıştık.

Bu yazıyı bir seri başlangıcı olarak düşünebiliriz. MVC ile ilgili “ne nasıl yapılır” diyerek yazılarımızı oluşturmaya çalışacağız. İlk yazımız olarakta Entity Framework kullanarak MVC Framework te bir veri tabanı uygulaması hazırlamak olacaktır.

Uygulamamızı Service Pack1 kurulu olan Visual Studio 2008 üzerinde geliştireceğiz. Ayrıca Ide ‘mizde MVC Framework 1.0 ‘ın da kurulu olması gerekmektedir. SP1 ‘ e olan ihtiyacımız ise Entity Framework ile tasarlayacak olduğumuz Entity Data Model ‘den kaynaklanmaktadır.

Eğer ki katmansal mimari kullanarak bir web uygulaması geliştiriyorsanız yazımızda yapacağımız örnek size çok daha aşina gelecektir. Çünkü bir Model katmanımız, Controller katmanımız ve View katmanımız olacaktır.

Yazımızda bir Film tablosu oluşturduktan sonra MVC Framework ile hazırladığımız web sayfalarında gösterme, ekleme ve düzenleme işlemlerini inceliyor olacağız. MVC Framework 'ü kullanarak uygulama nasıl oluşturulur diyerek artık örneğimize ve yazımıza başlayabiliriz.

Visual Studio 2008 ‘i açtıktan sonra File->New Project adımlarını izledikten sonra aşağıdaki ekrandan yararlanarak bir ASP.NET MVC Web Application oluşturuyoruz.



Oluşturma işlemini yap dediğimizde bize test projesi de oluşturayım mı diye soran bir ekran çıkacaktır. Biz test projesi istemiyoruz seçeneğini seçerek uygulamamıza devam ediyor olacağız.

Not: Visual Web Developers sürümünde bu ekran çıkmayacaktır.



Artık MVC uygulamamız oluşmuştur. Oluşturulan proje dosyalarını incelediğimizde bize Model, Controller ve View dosyalarının oluşturulmuş olduğunu, içeriğine de gerekli kod dosyaları ve aspx sayfalarının oluştuulduğunu görürüz. Proje dosyasında bizler biraz temizlik yapalım. Veri tabanını uygulamamıza ekledikten sonra tekrardan oluşturacağımız için;

• Controllers\HomeController.cs
• Views\Home


dosyalarını siliyoruz.

Veri tabanını oluşturuyoruz...

Örneğimizde kullanmak için bir veri tabanı oluşturmamız gerekmektedir. Bu işlemi sistemimizde kurulu olan SQL sürümüne göre değişik bir şekilde yapabilmemiz mümkündür. Bilgisayarlarında SQL Express kurulu olan arkadaşlar management studio kullanmadan direk Visual Studio üzerinden AddNewItem -> Data -> SQL DataBase adımlarını uygulayarak *.mdf uzantılı sql tabloları oluşturup üzerinde işlem yapabilmeleri mümkündür. Bir diğer adım ise SQL Server Management Studio üzerinden bir veri tabanı oluşturup onun üzerinde tablo oluşturduktan sonra visual studio üzerinde server explorer panelinden veri tabanını uygulamamıza göstererek kullanmaktadır. Biz bu seçeneklerden ikincisi üzerinde uygulamamızı geliştiriyor olacağız.

SQL Server Management Studio ‘yu açarak Sirket isimli veri tabanımızı oluşturuyoruz. Daha sonra sirket veri tabanımızın içerisine Film isimli tablomuzu aşağıdaki elemanlar ile oluşturuyoruz.



Tablomuzu ve kolonlarımızı oluşturduktan sonra Id alanını otomatik artan özelliğini atamamız gerekmektedir. Bunun için özellikler bölümünden Identity Column ‘a Id alanını veriyoruz.



Artık veri tabanımızı ve tablomuzu oluşturmuş bulunuyor. Şimdi biraz Film tablomuza daha sonraki işlemlerimizde kullanmak üzere bir kaç veri girelim.



Entity Framework ile Model Oluşturuyoruz...

Veri tabanı üzerindeki işlemlerimizi MVC uygulamamızda kullanabilmemiz veri tabanı modelini oluşturmamız gerekmektedir. Bu işlemi de Entity Data Model üzerinden yapıyor olacağız. İlk olarak oluşturmuş olduğumuz veri tabanını server explorer üzerinden visual studio ‘da kullanabilir duruma getiriyoruz.

Server Explorer üzerinde veri tabanı Connect to Database seçeneğine tıkladıktan sonra karşımıza gelen ekranda Microsoft SQL Server ‘ı seçiyoruz ve bağlantımızı ekleyeceğimiz ekrana geliyoruz. Gerekli parametreleri ekleyip veri tabanı bağlantımızı test ettikten sonra ekleme işlemini tamamlıyoruz. Eğer bu işlemi başarılı bir şekilde tamamladıysak karşımıza aşağıdaki gibi görünüm oluşacaktır.



Kullanılabilir bir veri tabanımız oluştuğuna göre model katmanımızı oluşturabiliriz. Model katman, OR/M, Nhibernate gibi toollarda çok sık bir şekilde kullanılır. MVC Framework ‘te OR/M toollarda olduğu gibi Model katmanı kullanmamazı istemektedir. Biz de bu katmanı ADO.NET Entity Framework ‘ü kullanarak oluşturacağız.

Model klasörünün üzerinde faremiz ile sağ tıklama yaparak Add -> NewItem -> Data -> ADO.NET Entity Data Model ‘i seçiyoruz.



Karşımıza geçen ekranlar sırasıyla;

1. Generate From Database
2. Choose Your Data Connection ekranında veri tabanını seçiyoruz.
3. Choose Your Database Object ekranında table seçeneğinde kullanacak olduğumuz Film veri tabanını seçerek işlememizi tamamlıyoruz.

İşlemlerimiz sonucunda Models klasörünün altında FilmDbModel.edmx dosyamız oluşmuş ve mapping browser ekranımız aşağıdaki resimde gördüğümüz şekilde oluşturulmuştur. Burada Column Mapping bölümünde veri tabanı kolonlarına karşılık gelen deger/özellikler ekranı oluşturulmuş ve kullanımıza sunulmuştur. Film tablomuza göre oluşturulmuş kolon mappingi değerleri aşağıdaki gibidir;

Id -> Id:Int32
Film_Adi -> Film_Adi:String
Yonetmen -> Yonetmen:String
Cikis_Tarihi -> Cikis_Tarihi:DateTime



Sınıfımızın adı ile veri tabanımızın adının çakışmaması için ismini Filmler olarak değiştiriyoruz. Başka bir zaman veri tabanı üzerinden direk işlem yapmaya kalkıştığımızda vermiş olduğumuz isimlerin çakışmaması için böyle bir değişiklik yaptık.

ASP.NET MVC Controller Oluşturuyoruz...

Projemizi ilk oluşturduğumuzda Controller klasörümüzün içerisindeki HomeController.cs kod dosyamızı silmiştik. Şimdi tekrardan bu sınıfımızı oluşturacağız. Uygulamamızın Solution Explorer ‘da Controllers klasörünün üzerinde Add->Controller... adımlarını izleyerek yeni bir controller sınıfı ekliyoruz.



Ekleyecek olduğumuz controller sınıfına silmiş olduğumuz HomeController adını veriyoruz, Create, Update ve Detail seçeneği seçili olacak şekilde işlemimizi tamamlıyoruz.



Eklediğimiz sınıfın kod içeriği varsayılan olarak aşağıdaki gibi olacaktır.

Controllers\HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;


namespace FilmUygulama.Controllers
{
   public class HomeController : Controller
   {
      //
      // GET: /Home/

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

      //
      // GET: /Home/Details/5

      public ActionResult Details(int id)
      {
         return View();
      }

      //
      // GET: /Home/Create

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

      //
      // POST: /Home/Create

      [AcceptVerbs(HttpVerbs.Post)]
      public ActionResult Create(FormCollection collection)
      {
         try
         {
            // TODO: Add insert logic here

            return RedirectToAction("Index");
         }
         catch
         {
            return View();
         }
      }

      //
      // GET: /Home/Edit/5

      public ActionResult Edit(int id)
      {
         return View();
      }

      //
      // POST: /Home/Edit/5

      [AcceptVerbs(HttpVerbs.Post)]
      public ActionResult Edit(int id, FormCollection collection)
      {
         try
         {
            // TODO: Add update logic here

            return RedirectToAction("Index");
         }
         catch
         {
            return View();
         }
      }
  }
}

Veri Tabanındaki Kayıtları Nasıl Listeleriz ?

HomeController sınıfında Index() metodu kayıtların listelenmesi için varsayılan metod olarak kabul edilmiştir. Index Controller ‘da ilk olarak çağırılacak metod olarak MVC ‘de karşımıza çıkmaktadır.

Index() metodunu veri tabanındaki Film tablosunda yer alan kayıtları göstermek için kullanacağız. Bu işlem için ilk yapmamız gereken Model katmanımızda map ettiğimiz Film tablosunu index metodunda kullanılacak bir şekilde düzenlemek olacaktır.

İsim alanı olarak FilmUygulama.Models ‘i ekledikten sonra index() metodunun üzerine model entity ‘i kod parçasını ekliyoruz.

private SirketEntities _db = new SirketEntities();

Sonrasında da return Index ‘e _db.FilmlerSet.ToList() anlatımını (expression) ekliyoruz. Düzenlemelerimiz sonucunda Index metodumuzun aşağıdaki şekilde olmuştur.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using FilmUygulama.Models;

namespace FilmUygulama.Controllers
{
    public class HomeController : Controller
    {
       //
       // GET: /Home/
       private SirketEntities _db = new SirketEntities();

       public ActionResult Index()
       {
          return View(_db.FilmlerSet.ToList());
       }
    }
}

Şimdi Index() metodunu kullanan bir View sayfa yapmamız gerekmektedir. Eskiden ve MVC kullanılmayan uygulamalarda hala bu işlemi yeni bir web sayfası oluşturur. Bi masterpage ‘e bağlayıp, sonrasında da veri tabanından çektiğimiz alanları sayfamızda kullandığımız server kontrollerine bağlayarak işlemlerimizi tamamlıyorduk. MVC Framework ile sonucu yine aynı olmasına karşı yapılış yöntemi biraz farklı ve basit. J

Biraz önce düzenlemiş olduğumuz index() metodumuzun üzerine faremiz ile sağ tıklama yapıyoruz.



Sonrasında karşımıza çıkan ekranda View Name ‘i index ve type ‘i de model katmanından alacağını belirterek işlemimizi tamamlıyoruz.



İşlemimiz sonucunda View klasörünün içerisine Home klasörü ve içerisinde index.aspx sayfamız oluşmuştur.

Views\Home\index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<FilmUygulama.Models.Filmler>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
   Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Index</h2>

<table>
   <tr>
      <th></th>
      <th>
         Id
      </th>
      <th>
         Film_Adi
      </th>
      <th>
         Yonetmen
      </th>
      <th>
         Cikis_Tarihi
      </th>
   </tr>

<% foreach (var item in Model) { %>

   <tr>
      <td>
         <%= Html.ActionLink("Edit", "Edit", new { id=item.Id }) %> |
         <%= Html.ActionLink("Details", "Details", new { id=item.Id })%>
      </td>
      <td>
         <%= Html.Encode(item.Id) %>
      </td>
      <td>
         <%= Html.Encode(item.Film_Adi) %>
      </td>
      <td>
         <%= Html.Encode(item.Yonetmen) %>
      </td>
      <td>
         <%= Html.Encode(String.Format("{0:g}", item.Cikis_Tarihi)) %>
      </td>
   </tr>

<% } %>

</table>

<p>
   <%= Html.ActionLink("Create New", "Create") %>
</p>

</asp:Content>

Oluşmuş olan sayfamızı incelediğimizde bizim için bir tablo görünümde veriler oluşturulmuş. Sonrasında ise model nesnesinin içerisindeki verilerde foreach döngüsü ile dönülerek bütün kayıtlar bizlere sunulmuştur.



Yeni bir kayıt oluşturuyoruz...

Index metodunda yapmış olduğumuz düzenlemeler ile Film tablosuna elle girmiş olduğumuz verileri sorunsuzca getirdik. Şimdi ise veri tabanına yeni bir kayıt eklemek istersek nasıl yapacağımızı incelemeyeceğiz.

Yeni bir kayıt işlemini parametresiz Create() metodu ile Create() metodunu aşırı yüklenmiş ve server post yolu ile haberleşen Create() metodu ile gerçekleştiriyoruz.

Aşırı yüklenmiş olan Create() metodu içersine form üzerinde kullanıcılar tarafında girilmiş olan değerleri alarak veri tabanına kayıt yapmaktadır.

Create() metodunu düzenleyerek kayıt yapar hale getirelim.

Create metodunu özelleştirme ilk başta kullanıcı tarafından girilmemesi gereken alanları çıkarmakla başlayalım. Bu işlemi yapmanın en basit yolu Bind edilecek olan alanlardan istediklerimizi çıkarmak olacaktır.

public ActionResult Create([Bind(Exclude=”Id”)] Filmler filmlerToCreate)

kod bloğunu kullanmamız durumunda artık Id yeni bir kayıt oluşturma esnasında kullanıcıya değer girmesi için gösterilmeyecektir.

ModelState form üzerinden verileri bind yolu ile iki yönlü kontrolünü yapar. Bizde ilk olarak isteğin ModelState ‘ten gelip gelmediğini kontrol edeceğiz.



Kontrollerimizi tamamladıktan sonra artık yeni bir kayıt işlemini yapabilecek durumu gelmiş bulunuyoruz. Yapmamız gereken, kod bloğumuzda kullanmış olduğumuz _db sınıfının içerisinde yer alan AddToFilmlerSet() metodunu kullanarak parametre olarak form üzerindeki değerleri toplamış olarak filmlerToCreate kolleksiyonunu vermemiz sonrasında da SaveChanges() metodu ile kayıt işlemimizin tamamlandığını belirtmemiz yeterli olacaktır.

Yapmış olduğumuz düzenlemeler sonucunda Create metodlarımız aşağıdaki gibi olmuştur.

//
// GET: /Home/Create

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

//
// POST: /Home/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")] Filmler filmlerToCreate)
{
   if (!ModelState.IsValid)
      return Create();
   try
   {
      _db.AddToFilmlerSet(filmlerToCreate);
      _db.SaveChanges();

       return RedirectToAction("index");
   }
   catch
    { return View(); }
}
Visual Studio yardımı ile basitçe Create web sayfamızı oluşturuyoruz. Yapmamız gerek index sayfasında olduğu gibi metodumuzun üzerinde sağ tıklama ile AddView seçeneğine tıklıyoruz. Sonrasında karşımıza çıkan ekranda içerik kısmında Create ‘i type tarafında da filmleri seçerek işlemimizi tamamlıyoruz.



View\Home\Create.aspx
s<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<FilmUygulama.Models.Filmler>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
   Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

   <h2>Create</h2>

   <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

   <% using (Html.BeginForm()) {%>

   <fieldset>
      <legend>Fields</legend>
      <p>
         <label for="Id">Id:</label>
         <%= Html.TextBox("Id") %>
         <%= Html.ValidationMessage("Id", "*") %>
      </p>
      <p>
         <label for="Film_Adi">Film_Adi:</label>
         <%= Html.TextBox("Film_Adi") %>
         <%= Html.ValidationMessage("Film_Adi", "*") %>
      </p>
      <p>
         <label for="Yonetmen">Yonetmen:</label>
         <%= Html.TextBox("Yonetmen") %>
         <%= Html.ValidationMessage("Yonetmen", "*") %>
      </p>
      <p>
         <label for="Cikis_Tarihi">Cikis_Tarihi:</label>
         <%= Html.TextBox("Cikis_Tarihi") %>
         <%= Html.ValidationMessage("Cikis_Tarihi", "*") %>
     </p>
     <p>
        <input type="submit" value="Create" />
     </p>
   </fieldset>

   <% } %>

   <div>
      <%=Html.ActionLink("Back to List", "Index") %>
   </div>

</asp:Content>



Film tablosunda boş geçilemez olarak tanımladığımız alanlar web sayfamıza da o şekilde aktarılmıştır. Ek olarak ID alanına dikkatinizi çekmek istiyorum. Hem aspx kod tarafında hem de ekran göreceğiniz üzere ID alanı gelmiştir. Fakat hatırlayacağınız üzere biz Create metodunda bu alanın bind edilmemesini istemiştik. Bu ID alanını görünmez kılmaz sadece kullanılmaz kılar. Yani biz ID ‘ye hangi değeri girersek girelim o tabloyu oluştururken tanımladığımız gibi otomatik artan bir sayı olarak değerlerini almaya devam edecektir. Yani ID alanını sayfamızdan çıkarttığımız durumda da işleyişimiz sorunsuz bir biçimde devam edecektir.

Değerlerimizi doğru bir biçimde girip kaydı oluştur dediğimizde sorunsuzca kaydımız gerçekleşecek ve index sayfamızda gözükecektir.

Kayıt düzenleme işlemini yapıyoruz...

Yazımız boyunca kayıtları listeleme ve yeni kayıt ekleme işlemlerini ne kadar kolay bir şekilde yapabildiğimize göz attık. Son olarak Düzenleme (Edit) işlemini nasıl yaptığımıza bakarak bu yazımızı sonlandıracağız.

Diğer işlemlerimizi yaparken Index() ve Create() metodlarını kullanmıştık. Düzenleme işlemi için ise HomeController.cs sınıfının içerisinde yer alan Edit() metodlarını kullanıyor olacağız. Edit ‘te Create ‘te olduğu gibi iki metoddan oluşmaktadır. Birincisi Id ‘den yararlanarak düzenlenecek olan kayıda ilişkin verileri form kontrollerine bind eder. İkincisi ise form kontrollerine bind edilmiş olan veriler üzerinde yapılmış olan değişiklikleri günceller.

İsterseniz bu sefer ilk olarak View klasörümüzün altında yer alacak olan Edit sayfamızı oluşturup ondan sonra metodlarımız içerisindeki gerekli düzenlemeleri yapalım.

Edit sayfamızı oluşturmak için metodumuzun üzerinde faremiz ile sağ tıklama sonrasında AddView seçeneğine tıkladıktan sonra karşımıza gelen ekranda ListContent tarafında Edit ‘i seçerek sayfamızı oluşturuyoruz.



Sayfamız oluşmuş durumda. Şimdi de Edit metodlarında düzenlemelerimizi yapıyoruz.

//
// GET: /Home/Edit/5

public ActionResult Edit(int id)
{
    var filmlerToEdit = (from m in _db.FilmlerSet
            where m.Id == id
            select m).First();
   return View(filmlerToEdit);
}

//
// POST: /Home/Edit/5

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Filmler filmlerToEdit)
{
   if (!ModelState.IsValid)
   return View();
   try
   {
      // TODO: Add update logic here
      var orjinalFilm = (from m in _db.FilmlerSet
               where m.Id == filmlerToEdit.Id
               select m).First();
       _db.ApplyPropertyChanges(orjinalFilm.EntityKey.EntitySetName, filmlerToEdit);
       _db.SaveChanges();

      return RedirectToAction("Index");
    }
    catch
    { return View(); }
}

Post edilmemiş edit metodunda Id ‘den yararlanılarak veriler getirilirken Post edilecek olan edit metodundan ID ile getirilmiş değerlerdeki verilerin güncelleme işlemi yapılmıştır.



Kaydet dediğimizde değişiklik işlemi tamamlanmış olacaktır.

Bir yazımızın sonuna daha geldik. MVC ile nasıl web sitesi oluşturulduğunu, veri tabanında oluşturmuş olduğumuz bir tabloyu Entity Framework ile nasıl kullanabileceğimizi ve bunu nasıl MVC Framework kullanılarak hazırlanmış bir web sitesinde kullanabileceğimizi, oluşturmuş olduğumuz model katmanı üzerinden select, create ve update işlemlerini nasıl yapacağımızı adım adım incelemeye çalıştık.

Diğer MVC yazılarımızda, bu yazımızda değinmiş olduğumuz controller, routing ve diğer bir çok konuyu açıklayarak devam ediyor olacağız.

Herkese mutlu ve başarılı bir gün diliyorum.

Turhal Temizer
info@turhaltemizer.com