Azure DB ile Mvc’de Code First İşlemleri.BÖLÜM-2

Şimdi Boş bir Mvc projesi açalım.Referance olarak DAL projemizi ekliyelim. Tüm DB işlemlerimizi bu dll üzerinden gerçekleştireceğiz. Aşağıdaki kodda görüldüğü gibi öncelikle bir Index View oluşturuyoruz. Burada amacımız sınıf,öğrenci ve ders verilerini aynı sayfa üzerinde düzenlemek ve listemek. Ayrıca herhangi birinde olan değişikliğin diğer ilişkili analar üzerinde olan etkisini görmek.Bu amaç doğrultusunda aşağıdaki kodda görüldüğü gibi SchollClass,ClassStudent ve StudentLesson için ayrı ayrı partial viewlar yaratıp hepsini Index view’da gösteriyoruz. Index.cshtml’e, herbir partial view Html.RenderAction‘la eklenmiştir. Amaç partial viewların beklediği view modellerin yani işlem yapacağı tablonun datalarının herbiri, homeController’da render zamanında kendi actionlarında doldurulmasıdır. Örneğin @{Html.RenderPartial(“PrtClass”, Model);} olsa idi istenen view modeli de Index viewımız’a yani homecontrollerın index action’ına da göndermek zorunda kalıcaktık. Bir başka konu da her partial view’ün kendine atanmış özel bir div ile sarmalanmış olmasıdır. Daha sonra buna neden ihityaç duyduğumuzu inceleyeceğiz.

Şimdi aşağıda kodu olan Shared/PrtClass.cshtml partial view’ımıza bakalım: Model olarak   @model List<DAL.SchollClass> beklemektedir. DAL codefirst projemizdeki NameSpace adıdır.Yeni Sınıf Adı girilen bir textbox,kaydet buttonu ve DAL.SchollClass’dan dönen kayıtlı sınıfların listesini gösteren bir tablo vardır. Kaydet button’una basılınca /Home/PrtClass’a post olur ve ilgili data json olarak gönderilir. Kaydetme işlemi bitince buna bağlı prtStudent’da ve prtLesson’da yeniden yüklenir. Çünkü tüm bu partail viewlarda classların listesi vardır ve class tablosunda bir değişiklik olduğu için yenilenmesi gerekmektedir. İşte bu yenileme işlemi yani partail viewların yeniden doldurulması, kendilerine atanmış divlerin htmllerine basılarak yapılır. Mesela class datas’ı aşağıda görüldüğü gibi  $(“#prtClass”).html(html); şeklinde doldurulmaktadır.

Sınıf Verilerinin ekran görüntüsü diğer öğrenci ve ders notları alanları ile birlikte aşağıdadır.

screen

 

Aşağıda kodu görülen HomeController/PrtClass’ı inceleyelim: Action’ın üstündeki  [ChildActionOnly] attribute’ü bu action’ın direk url’den çağrılamamasını sağlar.Yani amaç güvenliktir. using(ScienceSchool context=new ScienceSchool()) bizim DB tarafındaki contextimizdir. Buradan istendiği gibi direk tablolara POCO’lar sayesinde erişilebilir. ScollClass’daki datalar çekildikten ve PrtClass’ın beklediği List<SchollClass> oluşturulduktan sonra,  ilgili datalar bu modele doldurulup gönderilir.  Bir de [HttpPost]’lu olan Datanın kaydedildiği PrtClass Action’ı vardır. Bu action’a sadece post işlemi ile erişilebilir. Yani gene url’den request ile bu action’a ulaşılamaz. Burada amaç hem güvenlik hem de get ve post actionları ayırmaktır..Burada gönderilen data, context’e eklenip kaydedilir.

  • context.SchollClass.Add(dataSC);
  • context.SaveChanges();

Daha sonra da kayıtlı classların yeniden listelenmesi için tüm kayıtlar tekrardan çekilip; ilgili divlerin htmllerine front tarafta javascript ile basılır. Burada önemli bir nokta da fronta gönderilen html, contoroller’ün  action’ından return PartialView() şeklinde gönderilmesidir.

Shared/PrtStudent.cshtml: Aşağıda yeni öğrenci kayıdı için ilgi saveStudent() post’umuz[$.post] ile ve öğrenci bilgisi değişince prtLesson partial view’ının tekrardan doldurulması görülmektedir.[$.get] ile ayrıca ClassStudent için gerekli kontroller burada tanımlanmıştır.Öğrencinin hangi sınıfta olucağının seçileceği  bir dropdown listesi,öğrenincinin adının,soyadının ve nosunun girileceği birer textbox ve bilgilerin kaydedileceği bir button vardır.En altta da öğrenci listesi olan bir tablo bulunmaktadir.

HomeController/PrtStudent: Burda da Class combosu ViewBag’e atılan data sayesinde doldurulmaktdır. ViewBag ile doldurulmasındaki amaç PrtStudent partial view’unun sadece ClassStudent modelini beklemesidir. Bir de ayrıca SchollClass modelini beklemesini istemedik. Kayıt edilecek öğrencinin sınıfı bu combodan belirlenir. Ayrıca ism,soy isim, ve No’suna ait bilgilerin girileceği bir alan ve önceki öğrenci kayıtlarının gösterildiği bir tablo vardır. Burada önemli olan ClassStudent POKO’suna  altaki eklenen property’dir [NotMapped]‘ın anlamı bu property’nin database ile eşlenmiyecek olması ve bizim sadece projede kendimize özel olarak kullanmış olmamızdır. Bu alalnın eklenmesinin amacı herbir öğrenici kaydı için bağlı olduğu class ismini tek tek çekmek yerine bağlı olduğu calss’ın ismini tutmasıdır.

[NotMapped] public string ClassName { get; set; }

Gene kaydetme ve verileri gösterme SchollClass ile aynıdır. Kaydetme işleminden sonra prtLesson tekrardan doldurulmaktadır. İlgili kod aşağıda görülmektedir.

Shared/PrtLesson.cshtml: Dersler’le ilgili post işlemi,sınıf combosu değişince ilgili öğrenci combosunun buna göre dolması ve önceki ders kayıtlarının listesinin bir tabloda gösterilmesi aşağıda kodlandığı gibidir. dropSelectStudent Ajax Post ile doldurulmaktadır. dataType’ı da json dır. Hatta bu datanın doldurduğu PrtLessonStudent partial view’ı dönecek bu datayı json’a yandaki komut ile çevirir.==>Json(cls)

HomeController/PrtLesson:Burada SchollClass Combosu yani Sınıf combosu değişince StudentList yani öğrenci listesine, bu sınıfta olanlar gelecek şekilde değişmektedir.Bunu için yeni bir Action eklenmiştir.  PrtLessonStudent.Diğer derslerle ilgili bilgiler girilip kaydedilmekte ve yine tüm ders kayıtları aşağıda bir tabloda gösterilmektedir.

Böylece birbiri ile bağlantılı azure üzerindeki üç tablomuzu, ScienceSchool database’i üzerinde yarattık. Code First POCO’larını tool yarıdımı ile oluşturduk. İlgili dataları çekme,kaydetme gibi işlerin yapıldığı Actionları yazıldıktan sonra buna bağlı partial view ve javascript kodlarını kodladık. Birinin değişmesi ile diğerleri üzerindeki etkisini detaylı olarak inceledik. En önemlisi de bu işlemleri yaparken esas yapmak isteğimiz işe konsantre olabildik. Önceden oluşturduğumuz DAL projemizde code first kullanarak DB ile olan tüm işlerimizi ayrıca emek ve zaman harcamadan gerçekleştirdik.

Geldik bir makalenin daha sonuna.

Yeni bir makalede görüşmek üzere herkese hoşçakalın.

Not:Örnek Url (İptal): http://codefirstonazure.azurewebsites.net/

Source Code: http://www.borakasmer.com/projects/CodeFirstBlog.rar

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.