Bölüm 7, ASP.NET Core bir sayfaya yeni bir alan ekleyin Razor

Gönderen Rick Anderson

Örnek kodu görüntüleyin veya indirin (nasıl indirilir).

bu bölümde Entity Framework için Code First Migrations kullanılır:

  • Modele yeni bir alan ekleyin.
  • Yeni alan şeması değişikliğini veritabanına geçirin.

bir veritabanını otomatik olarak oluşturmak için EF Code First kullanırken Code First:

  • __EFMigrationsHistoryVeritabanı şemasının oluşturulduğu model sınıflarıyla eşitlenmiş olup olmadığını izlemek için veritabanına bir tablo ekler.
  • Model sınıfları veritabanıyla eşitlenmiyorsa, EF bir özel durum oluşturur.

Şemanın ve modelin eşitlenmiş olduğunu otomatik doğrulama, tutarsız veritabanı kodu sorunlarını bulmayı kolaylaştırır.

Film modeline bir derecelendirme özelliği ekleme

  1. Modeller/film. cs dosyasını açın ve bir özellik ekleyin Rating :

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; }
    }
    
  2. Uygulamayı oluşturun.

  3. Sayfaları/filmleri/ Index . cshtml'yi düzenleyin ve bir Rating alan ekleyin:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <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>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  4. Aşağıdaki sayfaları bir Rating alanla güncelleştirin:

Veritabanı yeni alanı içerecek şekilde güncelleştirilene kadar uygulama çalışmaz. Uygulamayı veritabanına güncelleştirme olmadan çalıştırmak şunu oluşturur SqlException :

SqlException: Invalid column name 'Rating'.

SqlExceptionÖzel durum, güncelleştirilmiş film modeli sınıfının, veritabanının film tablosunun şemasından farklı olmasından kaynaklanır. RatingVeritabanı tablosunda sütun yok.

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

  1. Yeni model sınıfı şemasını kullanarak veritabanını otomatik olarak bırakıp yeniden oluşturmaya Entity Framework. Bu yaklaşım geliştirme döngüsünün başlarında, model ve veritabanı şemasını birlikte hızla geliştirmenizi sağlar. Downsıde, veritabanında var olan verileri kaybetmeniz. Bu yaklaşımı bir üretim veritabanında kullanmayın! Veritabanını şema değişikliklerinde bırakıp bir başlatıcı kullanarak veritabanının test verileriyle otomatik olarak çekirdeğini oluşturmak, genellikle bir uygulama geliştirmeye yönelik üretken bir yoldur.

  2. Mevcut veritabanının şemasını model sınıflarıyla eşleşecek şekilde açıkça değiştirin. Bu yaklaşımın avantajı, verilerin tutulması. Bu değişikliği el ile ya da bir veritabanı değişiklik betiği oluşturarak yapın.

  3. veritabanı şemasını güncelleştirmek için Code First Migrations kullanın.

Bu öğretici için Code First Migrations kullanın.

SeedDataSınıfını yeni sütun için bir değer sağlayacak şekilde güncelleştirin. Aşağıda örnek bir değişiklik gösterilmektedir, ancak her bir blok için bu değişikliği yapın new Movie .

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

Tamamlanan SeedData. cs dosyasınabakın.

Çözümü derleyin.

Derecelendirme alanı için bir geçiş ekleyin

  1. araçlar menüsünde, NuGet Paket Yöneticisi > Paket Yöneticisi konsolunu seçin.

  2. PMC 'de aşağıdaki komutları girin:

    Add-Migration Rating
    Update-Database
    

Add-MigrationKomut, çerçeveye şunları belirtir:

  • MovieModeli Movie veritabanı şemasıyla karşılaştırın.
  • Veritabanı şemasını yeni modele geçirmek için kod oluşturun.

"Derecelendirme" adı rastgele olur ve geçiş dosyasını adlandırmak için kullanılır. Geçiş dosyası için anlamlı bir ad kullanılması yararlı olur.

Update-DatabaseKomutu, çerçeveye şema değişikliklerini uygulamaya uygulayıp mevcut verileri korumasını söyler.

Veritabanındaki tüm kayıtları silin, başlatıcı veritabanını temel alır ve Rating alanı içerir. Silme işlemi, tarayıcıda veya SQL Server Nesne Gezgini (ssox) ile yapılan silme bağlantılarıyla yapılabilir.

Başka bir seçenek de veritabanını silmek ve geçişleri kullanarak veritabanını yeniden oluşturmaktır. SSOX 'te veritabanını silmek için:

  1. SSOX 'te veritabanını seçin.

  2. Veritabanına sağ tıklayın ve Sil' i seçin.

  3. Mevcut bağlantıları kapat' a bakın.

  4. Tamam’ı seçin.

  5. PMC'de veritabanını güncelleştirin:

    Update-Database
    

Uygulamayı çalıştırın ve bir alan ile film oluşturabileceğiniz/düzenleyebileceğiniz/görüntüleydiğinizi doğrulayın Rating . Veritabanı birlikte olmazsa, yönteminde bir kesme noktası ayarlayın SeedData.Initialize .

Ek kaynaklar

Örnek kodu görüntüleyin veya indirin (nasıl indirilir).

bu bölümde Entity Framework için Code First Migrations kullanılır:

  • Modele yeni bir alan ekleyin.
  • Yeni alan şeması değişikliğini veritabanına geçirin.

bir veritabanını otomatik olarak oluşturmak için EF Code First kullanırken Code First:

  • __EFMigrationsHistoryVeritabanı şemasının oluşturulduğu model sınıflarıyla eşitlenmiş olup olmadığını izlemek için veritabanına bir tablo ekler.
  • Model sınıfları veritabanıyla eşitli değilse EF bir özel durum oluşturur.

Şemanın ve modelin eşitlenen bir şekilde otomatik olarak doğrulanması, tutarsız veritabanı kodu sorunlarını bulmayı kolaylaştırır.

Film Modeline Derecelendirme Özelliği Ekleme

  1. Models/Movie.cs dosyasını açın ve bir özellik Rating ekleyin:

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
    
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
    
        [Column(TypeName = "decimal(18, 2)")]
        public decimal Price { get; set; }
        public string Rating { get; set; }
    }
    
  2. Uygulamayı oluşturun.

  3. Pages/Movies/ Index .cshtml dosyasını düzenleyin ve bir alan Rating ekleyin:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <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>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  4. Aşağıdaki sayfaları bir alanla Rating güncelleştirin:

Veritabanı yeni alanı içerecek şekilde güncelleştirilene kadar uygulama çalışmaz. Uygulamayı veritabanında güncelleştirme olmadan çalıştırma işlemi bir SqlException oluşturur:

SqlException: Invalid column name 'Rating'.

Özel SqlException durum, güncelleştirilmiş Film modeli sınıfının veritabanının Film tablosu şemasından farklı olmasıdır. Veritabanı tablosunda Rating sütun yoktur.

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

  1. Yeni Entity Framework sınıf şemasını kullanarak veritabanını otomatik olarak bırakmanızı ve yeniden oluşturmanızı sağlar. Bu yaklaşım, geliştirme döngüsünün erken bir aşamasında kullanışlıdır ve modeli ve veritabanı şemasını hızla geliştirmeyi sağlar. Dezavantajı, veritabanındaki mevcut verileri kaybetmenizdir. Üretim veritabanında bu yaklaşımı kullanmayın! Veritabanını şema değişikliklerine bırakmak ve veritabanını test verileriyle otomatik olarak oluşturmak için başlatıcı kullanmak genellikle uygulama geliştirmenin verimli bir yoludur.

  2. Var olan veritabanının şemasını model sınıflarına eş olacak şekilde açıkça değiştirme. Bu yaklaşımın avantajı, verileri tutmaktır. Bu değişikliği el ile veya bir veritabanı değişiklik betiği oluşturarak yapabilirsiniz.

  3. Veritabanı Code First Migrations güncelleştirmek için Code First Migrations'i kullanın.

Bu öğretici için Code First Migrations.

SeedDataSınıfını, yeni sütun için bir değer sağlayan şekilde güncelleştirin. Aşağıda örnek bir değişiklik gösterilmiştir ancak bu değişikliği her blok için new Movie yapabilirsiniz.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

Tamamlanan SeedData.cs dosyasına bakın.

Çözümü derleyin.

Derecelendirme alanı için geçiş ekleme

  1. Araçlar menüsünden Konsol'NuGet Paket Yöneticisi > Paket Yöneticisi seçin.

  2. PMC'ye aşağıdaki komutları girin:

    Add-Migration Rating
    Update-Database
    

komutu Add-Migration çerçeveye şunları söyler:

  • Modeli Movie veritabanı Movie şemasıyla karşılaştırın.
  • Veritabanı şemasını yeni modele geçirmek için kod oluşturun.

"Derecelendirme" adı rastgeledir ve geçiş dosyasına ad olarak kullanılır. Geçiş dosyası için anlamlı bir ad kullanmak yararlı olur.

komutu Update-Database çerçeveye şema değişikliklerini veritabanına uygulamasını ve mevcut verileri korumasını söyler.

Veritabanındaki tüm kayıtları silersiniz, başlatıcı veritabanının çekirdeğini oluşturur ve alanını Rating içerir. Bunu tarayıcıda veya Sql Server tarayıcısında (SSOX) Nesne Gezgini bağlantılarıyla yapabiliriz.

Bir diğer seçenek de veritabanını silmek ve geçişleri kullanarak veritabanını yeniden oluşturmaktır. SSOX'te veritabanını silmek için:

  • SSOX'te veritabanını seçin.

  • Veritabanına sağ tıklayın ve Sil'i seçin.

  • Var olan bağlantıları kapat'a göz seçin.

  • Tamam’ı seçin.

  • PMC'deveritabanını güncelleştirin:

    Update-Database
    

Uygulamayı çalıştırın ve bir alanla film oluştur/düzenle/göster olduğunu Rating doğrulayın. Veritabanı çekirdeğini oluşturmamışsa yönteminde bir kesme noktası SeedData.Initialize ayarlayın.

Ek kaynaklar

Bu bölümde Entity Framework Code First Migrations için kullanılır:

  • Modele yeni bir alan ekleyin.
  • Yeni alan şeması değişikliğini veritabanına geçirme.

BIR veritabanını otomatik Code First izlemek için EF Code First:

  • Veritabanı şemasının, oluşturulan model sınıfları ile eşitlenen olup olmadığını izlemek __EFMigrationsHistory için veritabanına bir tablo ekler.
  • Model sınıfları veritabanıyla eşit değilse bir özel durum oluşturur.

Şemanın ve modelin eşitlenen bir şekilde otomatik olarak doğrulanması, tutarsız veritabanı kodu sorunlarını bulmayı kolaylaştırır.

Film Modeline Derecelendirme Özelliği Ekleme

  1. Models/Movie.cs dosyasını açın ve bir özellik Rating ekleyin:[!code-csharp]

  2. Pages/Movies/ Index .cshtml dosyasını düzenleyin ve bir alan Rating ekleyin:

    @page
    @model RazorPagesMovie.Pages.Movies.IndexModel
    
    @{
        ViewData["Title"] = "Index";
    }
    
    <h1>Index</h1>
    
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    
    <form>
        <p>
            <select asp-for="MovieGenre" asp-items="Model.Genres">
                <option value="">All</option>
            </select>
            Title: <input type="text" asp-for="SearchString" />
            <input type="submit" value="Filter" />
        </p>
    </form>
    
    <table class="table">
    
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Genre)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Price)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Movie[0].Rating)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Movie)
            {
                <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>
                        <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    
  3. Aşağıdaki sayfaları bir alanla Rating güncelleştirin:

Veritabanı yeni alanı içerecek şekilde güncelleştirilene kadar uygulama çalışmaz. Uygulamayı veritabanında güncelleştirme olmadan çalıştırma işlemi bir SqlException oluşturur:

SqlException: Invalid column name 'Rating'.

Özel SqlException durum, güncelleştirilmiş Film modeli sınıfının veritabanının Film tablosu şemasından farklı olmasıdır. Veritabanı tablosunda Rating sütun yoktur.

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

  1. Yeni Entity Framework sınıf şemasını kullanarak veritabanını otomatik olarak bırakmanızı ve yeniden oluşturmanızı sağlar. Bu yaklaşım geliştirme döngüsünün erken bir aşamasında kullanışlıdır ve geliştiricilerin modeli ve veritabanı şemasını hızla geliştirmelerini sağlar. Dezavantajı, veritabanındaki mevcut verilerin kaybedilir. Üretim veritabanında bu yaklaşımı kullanmayın! Veritabanını şema değişikliklerine bırakmak ve veritabanını test verileriyle otomatik olarak oluşturmak için başlatıcı kullanmak genellikle uygulama geliştirmenin verimli bir yoludur.
  2. Var olan veritabanının şemasını model sınıflarına eş olacak şekilde açıkça değiştirme. Bu yaklaşımın avantajı, verileri tutmaktır. Bu değişikliği el ile veya bir veritabanı değişiklik betiği oluşturarak yapabilirsiniz.
  3. Veritabanı Code First Migrations güncelleştirmek için Code First Migrations'i kullanın.

Bu öğretici için Code First Migrations.

SeedDataSınıfını, yeni sütun için bir değer sağlayan şekilde güncelleştirin. Aşağıda örnek bir değişiklik gösterilmiştir ancak bu değişikliği her blok için new Movie yapabilirsiniz.

context.Movie.AddRange(
    new Movie
    {
        Title = "When Harry Met Sally",
        ReleaseDate = DateTime.Parse("1989-2-12"),
        Genre = "Romantic Comedy",
        Price = 7.99M,
        Rating = "R"
    },

Tamamlanan SeedData.cs dosyasına bakın.

Çözümü derleyin.

Derecelendirme alanı için geçiş ekleme

  1. Araçlar menüsünden Konsol'NuGet Paket Yöneticisi > Paket Yöneticisi seçin.

  2. PMC'ye aşağıdaki komutları girin:

    Add-Migration Rating
    Update-Database
    

komutu Add-Migration çerçeveye şunları söyler:

  • Modeli Movie veritabanı Movie şemasıyla karşılaştırın.
  • Veritabanı şemasını yeni modele geçirmek için kod oluşturun.

"Derecelendirme" adı rastgeledir ve geçiş dosyasına ad olarak kullanılır. Geçiş dosyası için anlamlı bir ad kullanmak yararlı olur.

komutu Update-Database çerçeveye şema değişikliklerini veritabanına uygulamasını ve mevcut verileri korumasını söyler.

Veritabanındaki tüm kayıtları siler, başlatıcı veritabanının çekirdeğini oluşturur ve alanını Rating içerir. Silme işlemi tarayıcıda veya Sql Server veritabanından (SSOX) Nesne Gezgini yapılabilir.

Bir diğer seçenek de veritabanını silmek ve geçişleri kullanarak veritabanını yeniden oluşturmaktır. SSOX'te veritabanını silmek için:

  1. SSOX'te veritabanını seçin.

  2. Veritabanına sağ tıklayın ve Sil'i seçin.

  3. Var olan bağlantıları kapat'a göz seçin.

  4. Tamam’ı seçin.

  5. PMC'deveritabanını güncelleştirin:

    Update-Database
    

Uygulamayı çalıştırın ve bir alan ile film oluşturabilirsiniz, düzenleyebilir ve Rating görüntüleyemezsiniz. Veritabanı çekirdeğini oluşturmamışsa yönteminde bir kesme noktası SeedData.Initialize ayarlayın.

Ek kaynaklar