Aracılığıyla paylaş


Film Modeli ve Tablosuna Yeni Alan Ekleme

tarafından Rick Anderson

Not

Bu öğreticinin ASP.NET MVC 5 ve Visual Studio 2013 kullanan güncelleştirilmiş bir sürümü burada sağlanır. Daha güvenlidir, takip etmek çok daha kolaydır ve daha fazla özellik gösterir.

Bu bölümde, değişiklik veritabanına uygulanabilmesi için model sınıflarına bazı değişiklikleri geçirmek için Entity Framework Code First Migrations kullanacaksınız.

Varsayılan olarak, bu öğreticinin önceki bölümlerinde yaptığınız gibi otomatik olarak veritabanı oluşturmak için Entity Framework Code First kullandığınızda Code First, veritabanının şemasının oluşturulduğu model sınıflarıyla eşitlenmiş olup olmadığını izlemeye yardımcı olmak için veritabanına bir tablo ekler. Eşitlenmemişlerse Entity Framework bir hata oluşturur. Bu, geliştirme zamanında yalnızca çalışma zamanında bulabileceğiniz (belirsiz hatalarla) sorunları izlemeyi kolaylaştırır.

Model Değişiklikleri için Kod İlk Geçişlerini Ayarlama

Visual Studio 2012 kullanıyorsanız, veritabanı aracını açmak için Çözüm Gezgini Movies.mdf dosyasına çift tıklayın. Web için Visual Studio Express Veritabanı Gezgini'ne, Visual Studio 2012'de Sunucu Gezgini'ne gösterilir. Visual Studio 2010 kullanıyorsanız SQL Server Nesne Gezgini kullanın.

Veritabanı aracında (Veritabanı Gezgini, Sunucu Gezgini veya SQL Server Nesne Gezgini), film veritabanını bırakmak için sağ tıklayın MovieDBContext ve Sil'i seçin.

Sunucu Gezgini penceresini gösteren ekran görüntüsü. Film D B Bağlamı sağ tıklama menüsünde Sil seçilidir.

Çözüm Gezgini'a geri dönün. film veritabanını kaldırmak için Movies.mdf dosyasına sağ tıklayın ve Sil'i seçin.

Çözüm Gezgini penceresini gösteren ekran görüntüsü. Filmler nokta m d f sağ tıklama menüsünde Sil seçilidir.

Hata olmadığından emin olmak için uygulamayı derleyin.

Araçlar menüsünden NuGet Paket Yöneticisi’ne ve ardından Paket Yöneticisi Konsolu’na tıklayın.

Paket Adam Ekle

Paket Yöneticisi Konsolu penceresindeki istemde PM> "Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext" yazın.

Paket Yöneticisi Konsolu penceresini gösteren ekran görüntüsü. Geçişleri Etkinleştir komutu girilir.

Geçişleri Etkinleştir komutu (yukarıda gösterilmiştir) yeni bir Migrations klasöründe Configuration.cs dosyası oluşturur.

Çözüm Gezgini penceresini gösteren ekran görüntüsü. Migrations klasörü ve Yapılandırma noktası c s dosyası kırmızıyla daire içine alınır.

Visual Studio Configuration.cs dosyasını açar. Seed Configuration.cs dosyasındaki yöntemini aşağıdaki kodla değiştirin:

protected override void Seed(MvcMovie.Models.MovieDBContext context)
{
    context.Movies.AddOrUpdate( i => i.Title,
        new Movie
        {
            Title = "When Harry Met Sally",
            ReleaseDate = DateTime.Parse("1989-1-11"),
            Genre = "Romantic Comedy",
            Price = 7.99M
        },

         new Movie
         {
             Title = "Ghostbusters ",
             ReleaseDate = DateTime.Parse("1984-3-13"),
             Genre = "Comedy",
             Price = 8.99M
         },

         new Movie
         {
             Title = "Ghostbusters 2",
             ReleaseDate = DateTime.Parse("1986-2-23"),
             Genre = "Comedy",
             Price = 9.99M
         },

       new Movie
       {
           Title = "Rio Bravo",
           ReleaseDate = DateTime.Parse("1959-4-15"),
           Genre = "Western",
           Price = 3.99M
       }
   );
   
}

altındaki Movie kırmızı dalgalı çizgiye sağ tıklayın ve Çözümle'yi seçip MvcMovie.Models'i kullanarak;

Film sağ tıklama menüsünde Çözümle'nin seçili olduğunu gösteren ekran görüntüsü.

Bunu yaptığınızda aşağıdaki using deyimi eklenir:

using MvcMovie.Models;

Not

Code First Migrations, her geçiş sonrasında Seed yöntemini çağırır (başka bir ifadeyle Paket Yöneticisi Konsolunda update-database çağrılır) ve bu yöntem zaten eklenmiş olan satırları güncelleştirir veya henüz yoksa bunları ekler.

Projeyi oluşturmak için CTRL-SHIFT-B tuşlarına basın.(Bu noktada derlemezseniz aşağıdaki adımlar başarısız olur.)

Sonraki adım, ilk geçiş için bir DbMigration sınıf oluşturmaktır. Yeni bir veritabanı oluşturmak için yapılan bu geçiş, önceki bir adımda movie.mdf dosyasını silmenin nedeni budur.

Paket Yöneticisi Konsolu penceresinde, ilk geçişi oluşturmak için "add-migration Initial" komutunu girin. "Initial" adı rastgeledir ve oluşturulan geçiş dosyasını adlandırmak için kullanılır.

Paket Yöneticisi Konsolu penceresini gösteren ekran görüntüsü. Bu geçiş dosyası için Tasarımcı Kodu ile başlayan paragraf vurgulanır.

Code First Migrations, Migrations klasöründe ({DateStamp}_Initial.cs) başka bir sınıf dosyası oluşturur ve bu sınıf veritabanı şemasını oluşturan kodu içerir. Geçiş dosya adı, sıralamaya yardımcı olmak için bir zaman damgasıyla önceden düzeltildi. {DateStamp}_Initial.cs dosyasını inceleyin, Film VERITABANı için Filmler tablosunu oluşturma yönergelerini içerir. Aşağıdaki yönergelerde veritabanını güncelleştirdiğinizde, bu {DateStamp}_Initial.cs dosyası çalışır ve VERITABANı şemasını oluşturur. Ardından Seed yöntemi çalıştırarak veritabanını test verileriyle doldurur.

veritabanını oluşturmak ve Seed yöntemini çalıştırmak için Paket Yöneticisi Konsolu'nda "update-database" komutunu girin.

Paket Yöneticisi Konsolu penceresini gösteren ekran görüntüsü. Veritabanı güncelleştirme komutu girilir.

Bir tablonun zaten var olduğunu ve oluşturulamadığını belirten bir hata alırsanız, bunun nedeni büyük olasılıkla veritabanını sildikten sonra ve yürütmeden update-databaseönce uygulamayı çalıştırmanızdır. Bu durumda, Movies.mdf dosyasını yeniden silin ve komutu yeniden deneyinupdate-database. Hata almaya devam ederseniz, geçişler klasörünü ve içeriğini silin ve ardından bu sayfanın üst kısmındaki yönergelerle başlayın (Movies.mdf dosyasını silin ve ardından Enable-Migrations'a geçin).

Uygulamayı çalıştırın ve /Filmler URL'sine gidin. Tohum verileri görüntülenir.

Dört film içeren M V C Film Dizini sayfasını gösteren ekran görüntüsü.

Film Modeline Derecelendirme Özelliği Ekleme

Mevcut Movie sınıfa yeni Rating bir özellik ekleyerek başlayın. Models\Movie.cs dosyasını açın ve aşağıdakine benzer bir özellik ekleyinRating:

public string Rating { get; set; }

Sınıfın tamamı Movie artık aşağıdaki koda benzer:

public class Movie
{
    public int ID { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    public decimal Price { get; set; }
    public string Rating { get; set; }
}

Filmi Derle>menü komutunu kullanarak veya CTRL-SHIFT-B tuşlarına basarak uygulamayı derleyin.

Sınıfı güncelleştirdiğinize Model göre, yeni Rating özelliği tarayıcı görünümünde görüntülemek için \Views\Movies\Index.cshtml ve \Views\Movies\Create.cshtml görünüm şablonlarını da güncelleştirmeniz gerekir.

\Views\Movies\Index.cshtml dosyasını açın ve Price sütununun hemen arkasına bir <th>Rating</th> sütun başlığı ekleyin. Ardından, değeri işlemek @item.Rating için şablonun sonuna yakın bir <td> sütun ekleyin. Güncelleştirilmiş Index.cshtml görünüm şablonu aşağıdaki gibidir:

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Price)
        </th>
         <th>
            @Html.DisplayNameFor(model => model.Rating)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Rating)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

Ardından \Views\Movies\Create.cshtml dosyasını açın ve formun sonuna aşağıdaki işaretlemeyi ekleyin. Bu, yeni bir film oluşturulduğunda derecelendirme belirtebilmeniz için bir metin kutusu oluşturur.

<div class="editor-label">
    @Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Rating)
    @Html.ValidationMessageFor(model => model.Rating)
</div>

Şimdi uygulama kodunu yeni Rating özelliği destekleyecek şekilde güncelleştirdiniz.

Şimdi uygulamayı çalıştırın ve /Filmler URL'sine gidin. Ancak bunu yaptığınızda aşağıdaki hatalardan birini görürsünüz:

Geçersiz İşlem Özel Durumu kullanıcı kodu tarafından işlenmemiş hatasını gösteren ekran görüntüsü.

Uygulamadaki Sunucu Hatası'nı belirten bir hatayla birlikte tarayıcı penceresini gösteren ekran görüntüsü.

Uygulamadaki güncelleştirilmiş Movie model sınıfı artık mevcut veritabanının tablosunun Movie şemasından farklı olduğundan bu hatayı görüyorsunuz. (Veritabanı tablosunda sütun yok Rating .)

Hatayı çözmek için birkaç yaklaşım vardır:

  1. Entity Framework'ün veritabanını yeni model sınıfı şemasına göre otomatik olarak bırakmasını ve yeniden oluşturmasını sağlayın. Bu yaklaşım, bir test veritabanında etkin geliştirme yaparken çok kullanışlıdır; model ve veritabanı şemasını birlikte hızla geliştirmenizi sağlar. Ancak bunun dezavantajı, veritabanındaki mevcut verileri kaybetmenizdir; bu nedenle bu yaklaşımı bir üretim veritabanında kullanmak istemezsiniz! Test verileriyle veritabanını otomatik olarak görmek için başlatıcı kullanmak genellikle uygulama geliştirmenin üretken bir yoludur. Entity Framework veritabanı başlatıcıları hakkında daha fazla bilgi için Bkz. Tom Dykstra'nın ASP.NET MVC/Entity Framework öğreticisi.
  2. Var olan veritabanının şemasını model sınıflarının eşleşmesi için açıkça değiştirin. Bu yaklaşımın avantajı, verilerinizi saklamanızdır. Bu değişikliği el ile veya veritabanı değişiklik betiği oluşturarak yapabilirsiniz.
  3. Veritabanı şemasını güncelleştirmek için Code First Migrations'ı kullanın.

Bu öğreticide Code First Migrations'ı kullanacağız.

Seed yöntemini yeni sütun için bir değer sağlayacak şekilde güncelleştirin. Migrations\Configuration.cs dosyasını açın ve her Movie nesnesine bir Derecelendirme alanı ekleyin.

new Movie
{
    Title = "When Harry Met Sally",
    ReleaseDate = DateTime.Parse("1989-1-11"),
    Genre = "Romantic Comedy",
    Rating = "G",
    Price = 7.99M
},

Çözümü derleyin ve Paket Yöneticisi Konsolu penceresini açın ve aşağıdaki komutu girin:

add-migration AddRatingMig

komutu, add-migration geçiş çerçevesine geçerli film modelini geçerli film veritabanı şemasıyla incelemesini ve veritabanını yeni modele geçirmek için gerekli kodu oluşturmasını söyler. AddRatingMig rastgeledir ve geçiş dosyasını adlandırmak için kullanılır. Geçiş adımı için anlamlı bir ad kullanmak yararlı olur.

Bu komut tamamlandığında, Visual Studio yeni DbMigration türetilmiş sınıfı tanımlayan sınıf dosyasını açar ve yönteminde Up yeni sütunu oluşturan kodu görebilirsiniz.

public partial class AddRatingMig : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Movies", "Rating", c => c.String());
    }
    
    public override void Down()
    {
        DropColumn("dbo.Movies", "Rating");
    }
}

Çözümü derleyin ve ardından Paket Yöneticisi Konsolu penceresine "update-database" komutunu girin.

Aşağıdaki görüntüde, Paket Yöneticisi Konsolu penceresindeki çıkış gösterilmektedir (AddRatingMig tarih damgası önceden eklenerek farklı olacaktır.)

Veritabanı güncelleştirme komutunu gösteren ekran görüntüsü.

Uygulamayı yeniden çalıştırın ve /Movies URL'sine gidin. Yeni Derecelendirme alanını görebilirsiniz.

Dört filmin listelendiği M V C Film Dizini sayfasını gösteren ekran görüntüsü.

Yeni bir film eklemek için Yeni Oluştur bağlantısına tıklayın. Derecelendirme ekleyebileceğinizi unutmayın.

7_CreateRioII

Oluştur’a tıklayın. Derecelendirme de dahil olmak üzere yeni film artık film listesinde gösterilir:

7_ourNewMovie_SM

Alanı Düzenle, Ayrıntılar ve SearchIndex görünüm şablonlarına da eklemeniz Rating gerekir.

Paket Yöneticisi Konsolu penceresine "update-database" komutunu yeniden girebilirsiniz ve şema modelle eşleştiğinden hiçbir değişiklik yapılmaz.

Bu bölümde model nesnelerini nasıl değiştirebileceğinizi ve veritabanını değişikliklerle eşitlenmiş durumda tutabileceğinizi gördünüz. Ayrıca senaryoları deneyebilmek için yeni oluşturulan bir veritabanını örnek verilerle doldurmanın bir yolunu da öğrendiniz. Şimdi model sınıflarına nasıl daha zengin doğrulama mantığı ekleyebileceğinize ve bazı iş kurallarının uygulanmasını nasıl etkinleştirebileceğinize bakalım.