Aracılığıyla paylaş


Film Modeli ve Tablosuna Yeni Alan Ekleme (C#)

tarafından Rick Anderson

Not

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

Bu öğreticide, Microsoft Visual Studio'nun ücretsiz sürümü olan Microsoft Visual Web Developer 2010 Express Service Pack 1'i kullanarak ASP.NET MVC Web uygulaması oluşturmanın temelleri öğretilecektir. Başlamadan önce, aşağıda listelenen önkoşulları yüklediğinizden emin olun. Aşağıdaki bağlantıya tıklayarak bunların tümünü yükleyebilirsiniz: Web Platformu Yükleyicisi. Alternatif olarak, aşağıdaki bağlantıları kullanarak önkoşulları tek tek yükleyebilirsiniz:

Visual Web Developer 2010 yerine Visual Studio 2010 kullanıyorsanız, şu bağlantıya tıklayarak önkoşulları yükleyin: Visual Studio 2010 önkoşulları.

C# kaynak kodu içeren bir Visual Web Developer projesi bu konuya eşlik edebilir. C# sürümünü indirin. Visual Basic'i tercih ediyorsanız, bu öğreticinin Visual Basic sürümüne geçin.

Bu bölümde model sınıflarında bazı değişiklikler yapacak ve veritabanı şemasını model değişiklikleriyle eşleşecek şekilde nasıl güncelleştirebileceğinizi öğreneceksiniz.

Film Modeline Derecelendirme Özelliği Ekleme

Var olan Movie sınıfa yeni Rating bir özellik ekleyerek başlayın. Movie.cs dosyasını açın ve özelliğini şu şekilde 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; }
}

Derleme FilmiHatalarını Ayıkla> menü komutunu kullanarak uygulamayı yeniden derleyin.

Sınıfı güncelleştirdiğinize Model göre, yeni Rating özelliği desteklemek 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 bir <td> sütun ekleyin. Güncelleştirilmiş Index.cshtml görünüm şablonunun görünümü aşağıdadır:

<table>
    <tr>
        <th></th>
        <th>Title</th>
        <th>Release Date</th>
        <th>Genre</th>
        <th>Price</th>
        <th>Rating</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 Me", "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>

Model ve Veritabanı Şeması Farklarını Yönetme

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

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

Uygulamadaki Sunucu Hatası hatasını gösteren 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 .)

Varsayılan olarak, bu öğreticinin önceki bölümlerinde yaptığınız gibi bir veritabanını otomatik olarak 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şitlenip eşitlenmediğini izlemeye yardımcı olmak için veritabanına bir tablo ekler. Eşitlenmemişlerse Entity Framework bir hata oluşturur. Bu, geliştirme zamanındaki sorunları izlemeyi kolaylaştırır ve aksi takdirde çalışma zamanında yalnızca (belirsiz hatalarla) bulabilirsiniz. Eşitleme denetimi özelliği, az önce gördüğünüz hata iletisinin görüntülenmesine neden olur.

Hatayı çözmek için iki 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, modeli ve veritabanı şemasını birlikte hızlı bir şekilde geliştirmenizi sağladığından test veritabanında etkin geliştirme yaparken çok kullanışlıdır. Ancak dezavantajı, veritabanındaki mevcut verileri kaybetmenizdir; bu nedenle bu yaklaşımı üretim veritabanında kullanmak istemezsiniz !
  2. Var olan veritabanının şemasını model sınıflarını eşleştirebilecek şekilde 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.

Bu öğreticide ilk yaklaşımı kullanacağız. Model değiştiğinde Entity Framework Code First veritabanını otomatik olarak yeniden oluşturacaksınız.

Model Değişikliklerinde Veritabanını Otomatik olarak Re-Creating

Uygulama modelini her değiştirdiğinizde Code First'ın veritabanını otomatik olarak bırakması ve yeniden oluşturması için uygulamayı güncelleştirelim.

Not

Uyarı Veritabanını otomatik olarak bırakma ve yeniden oluşturma yaklaşımını yalnızca bir geliştirme veya test veritabanı kullanırken etkinleştirmeniz ve hiçbir zaman gerçek veri içeren bir üretim veritabanında etkinleştirmeniz gerekir. Bunu bir üretim sunucusunda kullanmak veri kaybına yol açabilir.

Çözüm Gezgini'daModeller klasörüne sağ tıklayın, Ekle'yi ve ardından Sınıf'ı seçin.

Çözüm Gezgini penceresini gösteren ekran görüntüsü. Ekle seçeneği Modeller sağ tıklama menüsünde seçilidir. Alt menüde sınıf seçilir.

Sınıfı "MovieInitializer" olarak adlandırın. sınıfını MovieInitializer aşağıdaki kodu içerecek şekilde güncelleştirin:

using System;
using System.Collections.Generic;
using System.Data.Entity;

namespace MvcMovie.Models {
    public class MovieInitializer : DropCreateDatabaseIfModelChanges<MovieDBContext> {
        protected override void Seed(MovieDBContext context) {
            var movies = new List<Movie> {  
  
                 new Movie { Title = "When Harry Met Sally",   
                             ReleaseDate=DateTime.Parse("1989-1-11"),   
                             Genre="Romantic Comedy",  
                             Rating="R",  
                             Price=7.99M},  

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

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

            movies.ForEach(d => context.Movies.Add(d));
        }
    }
}

sınıfı, MovieInitializer model sınıfları değişirse model tarafından kullanılan veritabanının bırakılması ve otomatik olarak yeniden oluşturulması gerektiğini belirtir. Kod, herhangi bir oluşturulduğunda (veya yeniden oluşturulduğunda) veritabanına otomatik olarak eklenecek bazı varsayılan verileri belirtmek için bir Seed yöntem içerir. Bu, her model değişikliği yaptığınızda veritabanını el ile doldurmanıza gerek kalmadan bazı örnek verilerle doldurmak için kullanışlı bir yol sağlar.

Sınıfı tanımladığınıza MovieInitializer göre, uygulamayı her çalıştırdığında model sınıflarının veritabanındaki şemadan farklı olup olmadığını denetlemesi için bağlamanız gerekir. Bu durumda başlatıcıyı çalıştırarak modelle eşleşecek şekilde veritabanını yeniden oluşturabilir ve ardından veritabanını örnek verilerle doldurabilirsiniz.

Projenin kökündeki MvcMoviesGlobal.asax dosyasını açın:

Genel nokta asax dot c s sekmesini gösteren ekran görüntüsü. Genel nokta asax, Çözüm Gezgini penceresinde kırmızıyla daire içine alınır.

Global.asax dosyası, projenin tüm uygulamasını tanımlayan sınıfını içerir ve uygulama ilk başlatıldığında çalışan bir Application_Start olay işleyicisi içerir.

Şimdi dosyanın en üstüne iki using deyimi ekleyelim. birincisi Entity Framework ad alanına, ikincisi ise sınıfımızın MovieInitializer yaşadığı ad alanına başvurur:

using System.Data.Entity;            // Database.SetInitialize
using MvcMovie.Models;              // MovieInitializer

Ardından aşağıda gösterildiği gibi yöntemini bulun Application_Start ve yönteminin başına bir çağrı Database.SetInitializer ekleyin:

protected void Application_Start()
{
    Database.SetInitializer<MovieDBContext>(new MovieInitializer());

    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

Database.SetInitializer Yeni eklediğiniz deyim, şema ve veritabanı eşleşmiyorsa örnek tarafından MovieDBContext kullanılan veritabanının otomatik olarak silinmesi ve yeniden oluşturulması gerektiğini belirtir. Gördüğünüz gibi, veritabanını sınıfında belirtilen MovieInitializer örnek verilerle de doldurur.

Global.asax dosyasını kapatın.

Uygulamayı yeniden çalıştırın ve /Filmler URL'sine gidin. Uygulama başlatıldığında, model yapısının artık veritabanı şemasıyla eşleşmediğini algılar. Veritabanını yeni model yapısıyla eşleşecek şekilde otomatik olarak yeniden oluşturur ve veritabanını örnek filmlerle doldurur:

7_MyMovieList_SM

Yeni 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

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 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.