Aracılığıyla paylaş


Yeni Alan Ekleme

tarafından Rick Anderson

Not

Visual Studio'nun en son sürümü kullanılarak bu öğreticinin güncelleştirilmiş bir sürümü burada kullanılabilir. Yeni öğreticide, bu öğretici üzerinde birçok geliştirme sağlayan ASP.NET Core MVC ağlanmaktadır.

Bu öğreticide ASP.NET Core MVC'ye denetleyiciler ve görünümler öğretildi. Razor Pages, web kullanıcı arabirimi oluşturmayı kolaylaştıran ve daha üretken hale getiren sayfa tabanlı bir programlama modeli olan ASP.NET Core'daki 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, 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

Çözüm Gezgini'a gidin. film veritabanını kaldırmak için Movies.mdf dosyasına sağ tıklayın ve 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ınır.

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

komut istemindeki Paket Yöneticisi Konsolu penceresine 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.

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 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. 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ı çizginin üzerine gelin ve MvcMovie.Models kullanarak öğesine tıklayın Show 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 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.

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ş sonrasında 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ştirmeleri sonrasında değişikliklerinizin kalmasını istersiniz. Bu durumda, koşullu ekleme işlemi yapmak istiyorsunuz: yalnızca henüz yoksa bir 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 özellik bu amaçla 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ş işleminizi gerçekleştirdiğinizde aşağıdaki özel durumla karşınıza çıkar.

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 önceki bir adımda movie.mdf dosyasını 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 Konsolunu gösteren ekran görüntüsü. Geçiş ekle komutundaki metin 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 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 Konsolunu 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 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). Hata almaya devam ederseniz SQL Server Nesne Gezgini açın ve veritabanını listeden kaldırın. "Dosya .mdf veritabanı olarak eklenemiyor" hatasını alırsanız web.config dosyasındaki bağlantı dizesi bir parçası olarak İlk Katalog özelliğini kaldırın.

Uygulamayı çalıştırın ve /Filmler 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

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; }

    [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ı derleyin (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. ve eylem yöntemlerinin bind özniteliğini Create özelliğini içerecek şekilde güncelleştirinRating:Edit

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

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ı 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")
    @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 /Filmler URL'sine gidin. Ancak bunu yaptığınızda aşağıdaki hatalardan birini görürsünüz:

Özel Durum Kullanıcısı İşlenmeyen Hatayı gösteren ekran görüntüsü.

Veritabanı oluşturulduktan sonra 'MovieDBContext' bağlamını arkalayan 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 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 geliştirme döngüsünün erken dönemlerinde ç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 . 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 = "PG",
    Price = 7.99M
},

Çözümü derleyin ve 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 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ı ön satış derecelendirmesi farklı olacaktır.)

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

Uygulamayı yeniden çalıştırın ve /Movies 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 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

Proje artık 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üzenleme, Ayrıntılar ve Sil 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 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 bir 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.