27 Aralık 2015 Pazar

MVC EntityFramework Bağlantısı, Bal-Dal Katmanları Ve Verilerin Listelenmesi

MVC projemizde Veritabanı ile çalışmak

Bu yazımızda veritabanı işlemlerini DAL katmanını ve alınan dataların listelenmesi işlemlerini anlatacağım daha onceki MVC yazımızın devamı netiliğinde olacaktır.
Veri tabanı ile haberleşme işlemini yaptığımız kod bloğunun bulunduğu katmana Data access Layer(dal) denir. Veritabanı ile haberleşmede EntityFramework kullanacağız. Peki entityFramework nedir dersek? Entityframework microsoftun ORM(object relational mapping) aracıdır.
Entityframework ile bizler aşağıdaki üç yaklaşımdan birini kullanırız
1. DatabaseFirst : Veritabanının hazır oluşturulduğu colonların tabloların ilişkilerin hazır olarak alınıp entityframeworkte kullanıldığı durumdur.(sadece verilen veritabanına uygun yapıyı üretiriz)
2. ModelFirst : Model sınıfının ve ilişkilerin visual studiodan oluşturulduğu entityframeworkun bize DAL  ve veritabanını (colon ve ilişkilerle birlikte) ürettiği yaklaşımdır.
3. CodeFirst : Herşeyin onceden code ile tasarlanıp yazıldığı yaklaşımdır. Uygulama ilk kez çalıştığında entityframework bizlere DAL ı aynı zamanda veritabanını colon ve ilişkiler ile birlikte ürettiği yaklaşımdır. 
Daha önceki çalışmalarımızı veritabanından bağmsız kendi oluşturduğumuz sınıflar ile yapmıştık bundan sonraki çalışmalarımızda veritabanını ve daha çok codefirst yapısını kullanarak ilerliyor olacağız bunun için işlemlerimize öncelikle yeni bir veritabanı oluşturarak başlamak istiyorum.
Bilgisayarımızda kurulu olan sql servera bağlanıp yeni bir veritabanı oluşturuyoruz.

Veritabanı oluşturma ve liste halinde gosterme
1.Sqlserver da database kısmına sağ tıklayıp CanliSatis Adında yeni bir veritabanı oluşturun.
2.Visual Studiomuzda projemizi açıp connectionString oluşturmak için Web.Config dosyasını açalım ve Configuration bolumunun içerisine
connectionStrings
add connectionString="Data Source=SAHIN;Initial Catalog=CanliSatis;Integrated Security =True"
name="CanliSatisDal"
providerName="System.Data.SqlClient"
connectionStrings
ifadesini ekliyoruz.
3.Projemize Entityframework u referans olarak ekliyoruz
Projemizin üzerine sağ tıklayıp->Manage Nuget packages diyoruz ve online kısmından entity framework aratıyoruz. Daha sonra install deyip projemize ekliyoruz.
4.Projemizin üzerine sağ tıkayip yeni klasor ekle diyoruz ve daha sonra bu klasorun icerisine CanliSatisDal diye bir class oluşturuyoruz.
Oluşturduğumuz sınıfın üstkısmında using olarak :using System.Data.Entity; referansını ekliyoruz daha sonra dbContext sınıfından miras alıyoruz.
public class CanliSatisDal:DbContext
{
}

5.Calisanlar sınıfımıza birincil anahtar ekleme islemini yapıyoruz. oncelikle using olarak
System.ComponentModel.DataAnnotations; ekliyoruz.Sonra key anahtarini gosteriyoruz
public class Calisanlar
{
[Key]
public string Ad { get; set; }
public string Soyad { get; set; }
public int Maas { get; set; }
public DateTime BaslamaTarihi { get; set; }
}

6. Simdi veritabani için maping işlemlerine başlıyoruz CanliSatisDal sinifimiza gidip OnModelCreating methodunu ezmemiz gerekiyor(override ediyoruz) using olarak proje adimizi ve model klasorumuzu ekliyoruz
using MVCSevenDayStart.Models;
public class CanliSatisDal:DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("tblCalisanlar");
base.OnModelCreating(modelBuilder);
}
}
(Run time) çalışma zamanında otomatik olarak tblCalisanlar tablomuzu oluşturacaktır.
7.Database clasımızı uygulamamızda tutmak için CanliSatisDal sinifimiza birde çalışanları dbSet olarak ekliyoruz
public class CanliSatisDal:DbContext
{
public DbSet Calisanlar { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("tblCalisanlar");
base.OnModelCreating(modelBuilder);
}
}

8.Simdi bir klasor daha ekliyoruz ismine Bal diyoruz ve içerisinde CanliSatisBal adinda bir klasor ekliyoruz. Daha once olusturdugumuz BusinessLayer(iş katmanı) içerisindeki kodu, verilerimiz databaseten gelecek şekilde değiştiriyoruz ve bu yeni sinifimiza ekliyoruz.(Bu işlemden sonra Model içerisindeki CalisanBusinesslayer sınıfını silebiliriz)
Tabiki ilk işlem olarak using sınıfını ekliyoruz. Bal sinifimiz aşagidadir
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using MVCSevenDayStart.Dal;
using MVCSevenDayStart.Models;
namespace MVCSevenDayStart.Bal
{
public class CanliSatisBal
{
public List GetCalisanlar()
{
CanliSatisDal canliSatisDal = new CanliSatisDal();

return canliSatisDal.Calisanlar.ToList();
}}}

Daha sonra bir hata alirsanız eger CalisanListController içerisine using olarak Bal klasorumuzu( using MVCSevenDayStart.Bal;) de eklemeyi unutmuyoruz.

CalisanlarListViewimizin son guncel hali
@using MVCSevenDayStart.Models
@model CalisanListViewModel
..
..
body div
Merhaba @Model.KullaniciAdi
div
div table tr
thCalisan Adi th
thMaasi th
tr
@foreach (CalisanViewModel item in Model.CalisanlarList)
{
tr
td@item.Ad td
td style="background-color:@item.CalisanRenk">@item.Maas td
tr
}
table div body
Eger derleme sonrasında sadece "Merhaba admin çalışan adi maasi"  yazan bir sayfa karşımıza geldi ise dogru adimları yapmışız :)

9.Simdi sqlserver tarafında veritabanımızı kontrol ediyoruz bakalım istedigimiz tblCalisanlar Sınıfımız oluştumu.

Evet adımları tektek yapı iseniz ve hata almadan çalıştırabildiyseniz sizinde tblCalisanlar sınıfınız oluşmustur ve simdi el ile birkac kayıt ekleyip tekrardan projemizi derleyelim. Eklediğimiz kayıtların listelendiğini görebiliriz.
Not:Hata almayan ve veritabanı oluşmayan arkadaşlar  içerisini tekrardan kontrol etmelerini oneririm burdaki yazım hataları bizim veritabanımızın oluşmasına engel olabilir.

Peki ya kullandığımız DbSet neyi ifade eder?
     Bizim veritabanından sorgu ile çektiğimiz tüm dataların tutulduğu, veritabanındaki tabloların temsil edildiği bir sınıfı ifade eder.Linq sorgusu yazdığımızda biz bu dbset nesnesini kullanırız oda veritabanındaki tablolara ceviri yaparak istedigimiz kolleksiyonları bizlere döndürür.
  
ConnectionString ve Dal arasındaki bağlantı nasıl olur?
Mapping işlemi connectionstring ifadesindeki name üzerinden yapılır. ConnectionStringName ve DalClass name aynı olduğu için otomatik olarak mapping "CanliSatisDal" gerçekleşir.

Simdi projemizde bazı değişiklikler yaparak katmanlı yapıyı daha anlamlı bir hale getirelim
İlk MVC Baslangic yazımızda anlattığımız bazı sınıfların isimlerini değistirelim ve daha anlamlı bir yapı oluşturalım.
* CalışanConroller olarak yeni bir controller olusturuyoruz ve icerisine index ile birlikte getcalisanlist action methodunu olusturuyoruz(CalisanListController icerisinden alabiliriz).
*Methodlara sağ tıklayıp add view diyoruz ve calisanview olusuyor icerisinde de iki methoda ait classlarımız olusuyor.
*GetCalisanDetay action methodumuzu yorum satirina alıyoruz Index methodumuzu yorum satırında ise yorum satırından çıkarıyoruz
*CalisanlarListViewModel içerisindeki calisanadi ozelliğini kaldırıyoruz. Ve Viewin içerisinde kullanılan alnıda kaldırıyoruz.
Son olarak SolutionExplorer goruntumuz aşağıdaki gibi oluyor


CalısanController.cs içerigi
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using MVCSevenDayStart.Models;
using MVCSevenDayStart.Bal;
namespace MVCSevenDayStart.Controllers
{
public class CalisanController : Controller
{

public ActionResult Index()
{
CalisanListViewModel calisanListViewModel = new CalisanListViewModel();

CanliSatisBal cnlsatisBal = new CanliSatisBal();
List calisanlarList = cnlsatisBal.GetCalisanlar();

List calisanViewModels = new List();

foreach (Calisanlar item in calisanlarList)
{
CalisanViewModel calisanViewModel = new CalisanViewModel();
calisanViewModel.Ad = item.Ad;
calisanViewModel.Soyad = item.Soyad;
calisanViewModel.Maas = item.Maas.ToString();
if (item.Maas > 1235)
{
calisanViewModel.CalisanRenk = "yellow";
}
else
{
calisanViewModel.CalisanRenk = "green";
}
calisanViewModels.Add(calisanViewModel);
}
calisanListViewModel.CalisanlarList = calisanViewModels;


return View("Index", calisanListViewModel);//-->View ismini degistiriyoruz
}

public ActionResult GetCalisanListesi()
{
CalisanListViewModel calisanListViewModel = new CalisanListViewModel();

CanliSatisBal cnlsatisBal = new CanliSatisBal();
List calisanlarList = cnlsatisBal.GetCalisanlar();

List calisanViewModels = new List();

foreach (Calisanlar item in calisanlarList)
{
CalisanViewModel calisanViewModel = new CalisanViewModel();
calisanViewModel.Ad = item.Ad ;
calisanViewModel.Soyad = item.Soyad;
calisanViewModel.Maas = item.Maas.ToString();
if (item.Maas > 1235)
{
calisanViewModel.CalisanRenk = "yellow";
}
else
{
calisanViewModel.CalisanRenk = "green";
}
calisanViewModels.Add(calisanViewModel);
}
calisanListViewModel.CalisanlarList = calisanViewModels;

return View("GetCalisanListesi", calisanListViewModel);
}

public string YaziYaz()
{
return "Merhaba Dunya’lı";
}
//müsteri donduren bir action method
//public Musteri getMusteri()
//{
// Musteri m = new Musteri();
// m.adi = "sahin";
// m.soyadı = "yaral";
// return m;
//}

//bir method içerisinde birden cok view çağırılabilir.
public ActionResult ilkView()
{
Random r = new Random();
int sayi= r.Next(0, 10);
if (sayi<5 br="">{
return Content(YaziYaz());
}
else
{
return View("Index");
}
}

//public ActionResult getCalisanDetay()
//{
// Calisanlar c = new Calisanlar();
// c.Ad = "safak";
// c.Soyad = "yaral";
// c.Maas = 1234;
// c.BaslamaTarihi = DateTime.Now;

// //viewdatamızı oluşturup çalısanımızı viewimize gonderiyoruz
// //ViewData["Calisan"] = c;
// //return View("Calisan");

// //viewdata yerine viewbag kullanımı
// //ViewBag.Calisanlar = c;
// //return View("Calisan");

// //genel olarak calisanlar sınıfını gondermek
// return View("Calisan", c);
//}
}
}
GetCalisanListesi.cshtml icerigi
Index.cshtml icerigi

F5  .../Calisan/Index sayfasına gittigimizde çalışanlarımızın listelendiğini gorebiliriz ayni zamanda .../Calisan/GetCalisanListesi ile de ayni listeyi elde edebiliriz.
Bu yazımızda database bağlantımızı ve kayıtları listeleme işlemini ele aldık bir sonraki yazımızda kayıt ekleme silme ve guncelleme işlemlerini ele alacağız
Kaynak :http://www.codeproject.com/Articles/986730/Learn-MVC-Project-in-days-Day

Hiç yorum yok:

Yorum Gönder