Sayfalar

13 Mart 2013 Çarşamba

ASP.NET MVC DERSLERİ ( 4.1.2 ) SCAFFOLDING

Bir önceki derste scaffolding konusunu anlatmaya çalışmıştık. Bu yazıda da yine aynı konuya devam edip bitirelim.

Scaffolding Template, Çalıştırılması

Controller eklerken açılan pencereden scaffolding ayarlarının nasıl yapıldığını anlatmıştık. Kullanacağımız sınıfı seçip daha sonra New Data Context dersek aşağıdaki ekran gelecektir. Bu ekran sayesinde oluşturduğumuz sınıfları bir DbContex ten türetilmiş sınıf içerisinde tanımlamaya gerek kalmaz. Bu ekranda oluşturacağımız DbContext sınıfının adını belirliyoruz.



DbContext sınıfımızın ismini belirledikten sonra OK diyoruz ve kapatıyoruz. Bu işlemlerden sonra controller sınıfımızın içerisinde CRUD işlemleri için action metodlar ve views klasörü içerisinde bu metodlara ait sayfalar eklenmiş olacaktır.

ConnectionString

Tüm bu işlemleri yaparken veriler nerde saklanıyor ve biz verileri nerden alıyoruz. Biz bu işlemleri yaparken EF web.config dosyası içerisindeki connectionString i kullanıyor. DbContext nesnesi bu connectionString ile sınıflarımızdan veritabanı oluşturuyor. Eğer connectionString belirlemediysek, var olan LocalDB kullanılıyor.

Database Initializer

Peki modellerimizde değişiklik olursa veritabanı bundan nasıl etkilenecek. Yeni modeller eklersek, var olan modellere özellik ekler ve ya silersek veritabanı güncelleme işi nasıl olacak. EF modellerdeki değişiklikleri tespit eder ve veritabanını günceller.

Bunun en kolay yolu veritananını yeniden oluşturmaktır. Yeniden oluşturma işlemini ister uygulama her çalıştığında yaparız istersekte sadece değişiklik olduğunda. Bu iki seçeneği System.Data.Entity altındaki Database sınıfı içerisindeki SetInitializer metodu ile belirleyebiliriz.

SetInitializer metodunu çağırırken IDatabaseInitializer nesnesini parametre olarak vermemiz gerekli. Bu sınıftan türeyen sınıflar, DropCreateDatabaseAlways ve DropCreateDatabaseIfModelChanges. Birincisi, uygulama her çalıştığında güncellemek için, ikincisi, sadece değişiklik olduğunda güncellemek içindir. Her iki gğncelleme nesneside generic sınıflara ihtiyac duyar. Bu generic sınıflar DbContext nesnesinden türemiş olmalıdır.

global.asax.cs sınıfının içerisinde aşağıdaki şekilde kullanılır.
protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseAlways<HaberPortalDB>());
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

Peki uygulama her başlatıldığında, veritabanını neden yeniden oluşturmak isteriz. Örneğin uygulamamızı bitirdik ve artık yayınlayacağız. Her defasında veritabanını elle oluşturmak yerine örnek verilerle uygulama başladığında kendisi oluştursun isteyebiliriz. Örneğin;
public class HaberPortalDBInitializer : DropCreateDatabaseAlways<HaberPortalDB>
{
    protected override void Seed(HaberPortalDB context)
    {
        context.Yazarlar.Add(new Yazarlar {Ad = "Ali"});
        context.Kategoriler.Add(new Kategoriler { Ad = "Spor" });
        context.Haberler.Add(new Haberler
        {
            Yazar = new Yazarlar { Name="Ali" },
            Kategori = new Kategoriler { Name="Spor" },
            Başlık = "Test Başlık"
        });
        base.Seed(context);
    }
}

yukarıdaki kodlarla kendi Initialzer sınıfımızı oluşturduk. Bunun örnek kullanımı
protected void Application_Start()
{
    Database.SetInitializer(new HaberPortalDBInitializer());
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

Böylece artık uygulama çalıştığında içerisinde örnek veriler olan bir veritabanı oluşturacaktır.Tüm bu anlatılanların sonucunda scaffolding ile alaklı karşımıza 3 adım çıkar.

    1. Model sınıflarımızı belirliyoruz.
    2. Controller ve view için scaffolding yapıyoruz.
    3. Veritabanı ilkleme stratejimizi belirliyoruz.

Unutulmaması gereken şey, scaffolding temel olarak kullanılacak kolaylıklar sağlar. Oluşan kodlar üzerinde istediğimiz gibi değişiklikler, eklemeler, çıkarmalar yapabiliriz.



3 yorum:

  1. Database.SetInitializer(null); Ne İşe Yaradıgını Açıklayabilrimisiniz Lütfen Acil

    YanıtlaSil
    Yanıtlar
    1. Var olan bir veritabanı ile çalışıyorsak ve veritabanının silinmesi ve ya yeniden oluşturulmasını istemiyorsak, SetInitializer null olur. Yani veritabanının yapısında her hangibir değişiklik yapma anlamındadır.

      Sil