Yeni Alan Ekleme

tarafından Rick Anderson

Not

Visual Studio'nun en son sürümünü kullanarak bu öğreticinin güncelleştirilmiş bir sürümüne buradan ulaşabilirsiniz. Yeni öğreticide, bu öğreticide birçok geliştirme sağlayan ASP.NET Core MVC kullanılır.

Bu öğreticide, denetleyiciler ve görünümlerle ASP.NET Core MVC öğretildi. Razor Pages, web kullanıcı arabirimi oluşturmayı daha kolay ve daha üretken hale getiren sayfa tabanlı bir programlama modeli olan ASP.NET Core'de yeni bir alternatiftir. Razor Pages öğreticisini MVC sürümünden önce denemenizi öneririz. Razor Pages öğreticisi:

  • Takip etmek daha kolaydır.
  • Daha fazla özelliği kapsar.
  • Yeni uygulama geliştirme için tercih edilen yaklaşımdır.

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

Varsayılan olarak, bu öğreticide daha önce 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ında yalnızca çalışma zamanında bulabileceğiniz (belirsiz hatalarla) sorunları izlemeyi kolaylaştırır.

Model Değişiklikleri için Code First Migrations Ayarlama

Çözüm Gezgini gidin. Movies.mdf dosyasına sağ tıklayın ve filmler veritabanını kaldırmak için Sil'i seçin. Movies.mdf dosyasını görmüyorsanız, aşağıda kırmızı anahatta gösterilen Tüm Dosyaları Göster simgesine tıklayın.

Film Denetleyicisi nokta c s sekmesini ve açık Çözüm Gezgini gösteren ekran görüntüsü. Tüm Dosyaları Göster simgesi kırmızıyla daire içine alınmış.

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 penceresinde istemine PM>

Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext

Paket Yöneticisi Konsolu penceresini gösteren ekran görüntüsü. Geçişleri Etkinleştir komutundaki metin vurgulanır.

Enable-Migrations komutu (yukarıda gösterilmiştir) yeni bir Migrations klasöründe configuration.cs dosyası oluşturur.

Çözüm Gezgini gösteren ekran görüntüsü. Migrations klasörünün Yapılandırma noktası c alt klasörü seçilidir.

Visual Studio Configuration.cs dosyasını açar. SeedConfiguration.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ı çizginin üzerine gelin ve MvcMovie.Modelskullanarak öğesine tıklayınShow Potential Fixes;

Olası Düzeltmeleri Göster menüsünü gösteren ekran görüntüsü. M V C Film noktası Modelleri'nin kullanılması seçilir ve bulunamıyor uyarısı gösterilir.

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 Konsolu'nda update-database çağırma) ve bu yöntem önceden eklenmiş satırları güncelleştirir veya henüz yoksa ekler.

Aşağıdaki koddaki AddOrUpdate yöntemi bir "upsert" işlemi gerçekleştirir:

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

Seed yöntemi her geçişle çalıştığından, eklemeye çalıştığınız satırlar veritabanını oluşturan ilk geçişten sonra zaten orada olacağı için veri ekleyemezsiniz. "upsert" işlemi, zaten var olan bir satır eklemeye çalıştığınızda oluşabilecek hataları önler, ancak uygulamayı test ederken yapmış olabileceğiniz verilerde yaptığınız değişiklikleri geçersiz kılar. Bazı tablolardaki test verileriyle bunun olmasını istemeyebilirsiniz: Bazı durumlarda, test sırasında verileri değiştirdiğinizde, veritabanı güncelleştirmelerinin ardından değişikliklerinizin kalmasını istersiniz. Bu durumda, koşullu ekleme işlemi yapmak istiyorsunuz: yalnızca henüz yoksa satır ekleyin.

AddOrUpdate yöntemine geçirilen ilk parametre, bir satırın zaten var olup olmadığını denetlemek için kullanılacak özelliği belirtir. Sağladığınız test filmi verileri için, Title listedeki her başlık benzersiz olduğundan özelliği bu amaç için kullanılabilir:

context.Movies.AddOrUpdate(i => i.Title,

Bu kod, başlıkların benzersiz olduğunu varsayar. El ile yinelenen bir başlık eklerseniz, bir sonraki geçişte aşağıdaki özel durumu alırsınız.

Sıra birden fazla öğe içeriyor

AddOrUpdate yöntemi hakkında daha fazla bilgi için bkz. EF 4.3 AddOrUpdate Yöntemi ile ilgilenme..

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. Bu geçiş yeni bir veritabanı oluşturur. Bu nedenle movie.mdf dosyasını önceki bir adımda silebilirsiniz.

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

Paket Yöneticisi Konsolu'nu gösteren ekran görüntüsü. Geçiş ekle komutundaki metin vurgulanır.

Code First Migrations Migrations klasöründe ({DateStamp}_Initial.cs adıyla) 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ı ile önceden düzeltildi. {DateStamp}_Initial.cs dosyasını inceleyin; Movie DB için tablo oluşturma Movies 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.

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

Paket Yöneticisi Konsolu'nu gösteren ekran görüntüsü. Veritabanını güncelleştir komutu pencerededir.

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 deneyin update-database . Hata almaya devam ederseniz migrations 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 Enable-Migrations bölümüne geçin). Hata almaya devam ederseniz SQL Server Nesne Gezgini açın ve veritabanını listeden kaldırın. ".mdf dosyası veritabanı olarak eklenemiyor" hatasını alırsanız, web.config dosyasındaki bağlantı dizesinin bir parçası olarak İlk Katalog özelliğini kaldırın.

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

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

Film Modeline Derecelendirme Özelliği Ekleme

Var olan Movie sınıfa yeni Rating bir özellik ekleyerek başlayın. Models\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; }

    [Display(Name = "Release Date")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    public decimal Price { get; set; }
    public string Rating { get; set; }
}

Uygulamayı derleme (Ctrl+Shift+B).

Sınıfına yeni bir alan eklediğinizden, bu yeni özelliğin Movie dahil edilmesi için bağlama izin verilenler listesini de güncelleştirmeniz gerekir. bind ve Edit eylem yöntemlerinin özniteliğini Create özelliğini içerecek şekilde güncelleştirinRating:

[Bind(Include = "ID,Title,ReleaseDate,Genre,Price,Rating")]

Ayrıca tarayıcı görünümünde yeni Rating özelliği görüntülemek, oluşturmak ve düzenlemek için görünüm şablonlarını 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 şablonunun görünümü aşağıdadır:

@model IEnumerable<MvcMovie.Models.Movie>
@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
    @Html.ActionLink("Create New", "Create")
    @using (Html.BeginForm("Index", "Movies", FormMethod.Get))
    {
    <p>
        Genre: @Html.DropDownList("movieGenre", "All")
        Title: @Html.TextBox("SearchString")
        <input type="submit" value="Filter" />
    </p>
    }
</p>
<table class="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 aşağıdaki vurgulanmış işaretlemeyi Rating içeren alanı ekleyin. Bu, yeni bir film oluşturulduğunda derecelendirme belirtebilmeniz için bir metin kutusu oluşturur.

<div class="form-group">
            @Html.LabelFor(model => model.Price, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Rating, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Rating, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Rating, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

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

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

özel durum kullanıcı işlenmeyen hata gösteren ekran görüntüsü.

Veritabanı oluşturulduktan sonra 'MovieDBContext' bağlamını arka planlayan model değişti. Veritabanını (https://go.microsoft.com/fwlink/?LinkId=238269) güncelleştirmek için Code First Migrations kullanmayı göz önünde bulundurun.

Uygulamadaki Sunucu Hatası bildirimine sahip bir tarayıcıyı gösteren ekran görüntüsü.

Uygulamadaki güncelleştirilmiş Movie model sınıfı artık mevcut veritabanının tablosunun şemasından Movie 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 geliştirme döngüsünün erken dönemlerinde çok uygundur; modeli ve veritabanı şemasını hızla geliştirmenizi sağlar. Ancak dezavantajı, veritabanındaki mevcut verileri kaybetmenizdir; bu nedenle bu yaklaşımı üretim veritabanında kullanmak istemezsiniz ! Test verilerine sahip bir 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. ASP.NET MVC/Entity Framework öğreticisi.
  2. Var olan veritabanının şemasını model sınıfları ile eşleşsin diye 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 öğretici için 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 = "PG",
    Price = 7.99M
},

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

add-migration Rating

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. Derecelendirme adı 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 komutunu girinupdate-database.

Aşağıdaki görüntüde , Paket Yöneticisi Konsolu penceresindeki çıkış gösterilmektedir (Tarih damgası ekleme derecelendirmesi farklı olacaktır.)

Veritabanı güncelleştirme komutunun girilmiş olduğu Paket Yöneticisi Konsolu penceresini gösteren ekran görüntüsü.

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

Derecelendirme alanının eklendiği M V C Film Dizini listesini gösteren ekran görüntüsü.

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

Artık proje geçişleri kullandığına göre, yeni bir alan eklediğinizde veya şemayı başka bir şekilde güncelleştirdiğinizde veritabanını bırakmanız gerekmez. Sonraki bölümde daha fazla şema değişikliği yapacak ve veritabanını güncelleştirmek için geçişleri kullanacağız.

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

Paket Yöneticisi Konsolu penceresine "update-database" komutunu yeniden girebilirsiniz ve şema modelle eşleştiğinden hiçbir geçiş kodu çalışmaz. Ancak, "update-database" çalıştırıldığında yöntem yeniden çalıştırılır Seed ve Seed verilerinden herhangi birini değiştirirseniz yöntem verileri yükselttiğinden Seed değişiklikler kaybolur. Tom Dykstra'nın popüler ASP.NET MVC/Entity Framework öğreticisinde yöntemi hakkında daha fazla bilgi Seed edinebilirsiniz.

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. Bu, Code First'e hızlı bir giriş niteliğindeydi. Konuyla ilgili daha eksiksiz bir öğretici için bkz. ASP.NET MVC Uygulaması için Entity Framework Veri Modeli Oluşturma . Ş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.