Sayfalar

6 Mart 2013 Çarşamba

ASP.NET MVC DERSLERİ ( 4.1.1 ) SCAFFOLDING

Bir önceki yazıda model kavramını açıklamaya çalışmıştık. Model tanımladıktan sonra bir sonraki adım, veritabanındaki kayıtlarımızı temsil eden bu modelleri yönetmek. Yani CRUD (Create, Read, Update, Delete) işlemlerinden bahsediyorum.

ASP.NET MVC bu konuda kolaylık sağlayan bir yapı sunar. Scaffolding bu yapının adıdır. Aslında Türkçe manası "iskele yapısı" olan bu kavramın adından da anlaşılacağı gibi, CRUD işlemleri için bir iskele yapısı oluşturur.

Yeni bir controller oluştururken açılan pencerede gerekli ayarları yapabiliriz.



Normalde modelleri kullanarak CRUD işlemleri yapmak için controller sınıfının içerisinde , Create, Details, Edit, Delete, List gibi fonksiyonlar olması gerekiyor ve her bir metod içinde bir view sayfası. Bunlar hemen hemen bütün projeler için ortak bir yapıdır. Dolayısıyla da otomatik olarak oluşturulması geliştirici için büyük kolaylık sağlar.

Scaffolding yapısından tümüyle bir uygulama beklememek lazım. Bu yapı sadece bizi tek tek metod ve view sayfaları oluşturmaktan kurtarır. Elbette farklı scaffolding şablonları da mevcut, bu şablonları da kullanarak farklı yapılarda iskeleler oluşturabiliriz. Oluşan metod ve sayfaları kendi isteğimize göre değiştirebiliriz.

MVC 4 te varsayılan olarak farklı türlerde scaffolding yapıları vardır. MVC 4 teki varsayılan iskele yapıları:

Empty Controller: Bu seçeneği işaretlersek sadece Index metodunu ekleyecektir. Bu metoda ait view sayfasıda olmayacaktır.

Controller with Empty Read/Write Actions: Bu seçenekte ise Index, Details, Create, Edit ve Delete metodları oluşturulur. Yine bu metodlar için view sayfaları yoktur. Bu kodların içerisini ve view sayfalarını kendiniz oluşturmalısınız.

API Controller with Empty Read/Write Actions: Bu şablon API geliştirirken kullanılacak olan seçenektir. ApiController sınıfından türeyen bir controller sınıfı oluşturur. Bununla ilgili detaylı bilgileri ileriki konularımızda WebApi konusu içerisinde görüyor olacağız.

Controller with Read/Write Actions and Views, Using Entity Framework: Bu seçenekte ise metodlarla birlikte veritabanı modelinin bilgisi ışığında gerekli olan kodları ve bu metodlara bağlı olan view sayfalarınıda ekler.



Controller sınıfının içerisinde oluşan metodlar.



Scaffolding veri erişimi için DataContext nesnesinin ismini kullanır. Önceden tanımladığımız, DbContext nesnemizin ismini kullanarak verilere erişim için gerekli kodları üretir. Peki DataContext nedir?

SCAFFOLDING VE ENTITY FRAMEWORK

Entity Framework (EF) nesne ilişkisel eşleşme (object-relational mapping) yapısıdır. EF nesnelerin veritabanında nasıl tutulduğunu bilir ve LINQ sorguları kullanarak veritabanındaki verileri yönetmeyi sağlar. ASP.NET MVC4 projesinde EF için gerekli dll projede ekli olarak gelir.

EF yi projemizde kullanmak zorunda değiliz. Daha farklı veri erişim teknolojilerini ve ya kendi veri erişim yapılarımızı kullanabiliriz.

Code-First Development

EF code-first development geliştirme tekniğinide destekler, code-first şu anlama gelir, SQL içerisinde veritabanı oluşturmadan verilerimizi depolamaya ve yönetmeye başlayabiliriz. Bu konuyu ilk defa duyanlar için biraz gerip gelebilir bu nasıl olur diye. Biz C# sınıflarını kullanarak modellerimizi ilişkili bir şekilde tanımlıyoruz.   Geri kalanını EF hallediyor. Örneğin siz Kategori adında bir sınıf oluşturdunuz EF bunu Kategori tablosu gibi kabul eder. Kategori sınıfı içerisinde ID özelliği varsa, EF bunu PrimaryKey kabul eder ve veritabanında bunu auto-increment olarak ayarlar. Bu konuyu ileride daha detaylı olarak inceleyeceğiz.

Peki hangi yöntemi kullanmalıyız. Eğer veritabanı konusunda daha bilgili olduğunuzu düşünüyorsanız, database-first ve ya model-first seçeneklerinden birini kullanabilirsiniz. code-first ise veritabanı konusuna daha çok girmek istemeyenler için ve kodlar üzerinde tam kontrol sağlamak için  tercih edilebilir.

Database-first özellikle önceden tasarlanmış ve başkaları tarafından yönetilen bir veritabanı kullanıyorsak kaçınılmaz olabilir. Kurumsal birçok projede veritabanı, veritabanı yöneticileri tarafından yönetildiği için bu durumlarda mantıklıdır. Bu seçim tamamen proje geliştirme stratejilerine bağlıdır.

DbContext Sınıfı

Eğere code-first development yapacaksak veritabanı temsil edecek yapıyı oluşturmak için EF nin DbContext sınıfını kullanmamız gerekiyor. Bu sınıftan türemiş olan sınıf bir ve ya daha fazla özellikte olabilen DbSet<T> tipini tipini kullanır. T kendi oluşturacağımız modelleri temsil eder. Örneğin aşağıdaki kod ile veritabanında Kategoriler ve Haberler diye iki tablo oluşturulur ve veriler bu tablolarda tutulur.
public class HaberPortalDB : DbContext
{
    public DbSet<Haberler> Haberler{ get; set; }
    public DbSet<Kategoriler> Kategoriler{ get; set; }
}

Artık veritabanı ve tablolar varmış gibi istedigimiz veriyi ekler, siler ve listeleriz. Örneğin;
var db = new HaberPortalDB();
var haberler = from haber in db.Haberler
                      orderby haber.Baslik ascending
                      select haber;

Yukarıdaki kod veritabanından bütün haberleri haber başlıklarına göre sıralı olarak getirir.

NOT: (Veri Erişim Stratejisi Seçimi)

Günümüzde birçok ve farklı veri erişim şekli vardır. Veriye erişimde farklılık kişisel (ve ya yazılım takımının) bir tercihtir. Bütün uygulamalar ve ya yazılımcılar için tekbir yaklaşım tabiki söz konusu değildir.

Scaffolding başlığı altında anlatmaya çalıştığımız bu yazıda aslında çok karmaşık olmayan, basit CRUD işlemleri için hızlı ve kolay bir yapıyı anlatmaya çalıştık. Aslında bir çok proje için CRUD işlemleri, basit validation işleri vardır. Scaffolding bu projeler için kullanışlıdır.

Daha karmaşık ve büyük projelerde farklı mimariler ve farklı tasarım desenleri kullanmak gerekebilir. Bu mimariler ve tasarım desenleri ile çalışırken Scaffolding işlevini yitirmeye başlar. Çünkü bu tasarım desenleri EF bağımlı elle yazılan sabit kodlardır.

Makalelerin uzun sürmesini istemiyorum. Bundan dolayıda bu makalenin ikinci kısmını ayrı olarak yayınlayacağım.

10 yorum:

  1. ellerine sağlık üstad

    YanıtlaSil
  2. Unsupported context type hatası veriyor.ayrıca modellere ekleme yaparken sizdeki personcontroller yok entity framework içerisinde .ne yapmam gerekiyor?

    YanıtlaSil
  3. bak şimdi dbcontext namespace ini ekle sorunu çözer yada code first yapılarda scaffording versiyon hatasıveriyo ole bşyse nasıl çözülür bilinmez

    YanıtlaSil
    Yanıtlar
    1. Scaffolding hatası veriyor bende ve iyice canımı sıktı, ne yaptıysam EF versiyonunun verdiği bu hatadan kurtulamadım, downgrade ettim 5.0 a ama yine olmadı ne yapacağım bilemedim :(
      entity framework hatası 276833

      Sil
  4. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  5. Arka tarafda oluşan şu kodların ne işe yaradıgını ve aralarındaki farkı açıklayabilirmisiniz

    @Html.DisplayFor(modelItem => item.Adi)
    @Html.DisplayNameFor(model => model.Fİyat)

    YanıtlaSil
    Yanıtlar
    1. http://agilewarrior.wordpress.com/2012/11/30/asp-net-mvc4-example/

      Sil
  6. hocam resimler gözükmüyor.yeniden yükleyebilirmisiniz

    YanıtlaSil
  7. Bu yorum yazar tarafından silindi.

    YanıtlaSil