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
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; } }Uygulamayı oluşturun.
Sayfaları/filmleri/ Index . cshtml'yi düzenleyin ve bir
Ratingalan 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>Aşağıdaki sayfaları bir
Ratingalanla 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:
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.
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.
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
araçlar menüsünde, NuGet Paket Yöneticisi > Paket Yöneticisi konsolunu seçin.
PMC 'de aşağıdaki komutları girin:
Add-Migration Rating Update-Database
Add-MigrationKomut, çerçeveye şunları belirtir:
MovieModeliMovieveritabanı ş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:
SSOX 'te veritabanını seçin.
Veritabanına sağ tıklayın ve Sil' i seçin.
Mevcut bağlantıları kapat' a bakın.
Tamam’ı seçin.
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
Models/Movie.cs dosyasını açın ve bir özellik
Ratingekleyin: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; } }Uygulamayı oluşturun.
Pages/Movies/ Index .cshtml dosyasını düzenleyin ve bir alan
Ratingekleyin:@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>Aşağıdaki sayfaları bir alanla
Ratinggü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:
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.
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.
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
Araçlar menüsünden Konsol'NuGet Paket Yöneticisi > Paket Yöneticisi seçin.
PMC'ye aşağıdaki komutları girin:
Add-Migration Rating Update-Database
komutu Add-Migration çerçeveye şunları söyler:
- Modeli
Movieveritabanı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
__EFMigrationsHistoryiç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
Models/Movie.cs dosyasını açın ve bir özellik
Ratingekleyin:[!code-csharp]Pages/Movies/ Index .cshtml dosyasını düzenleyin ve bir alan
Ratingekleyin:@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>Aşağıdaki sayfaları bir alanla
Ratinggü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:
- 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.
- 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.
- 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
Araçlar menüsünden Konsol'NuGet Paket Yöneticisi > Paket Yöneticisi seçin.
PMC'ye aşağıdaki komutları girin:
Add-Migration Rating Update-Database
komutu Add-Migration çerçeveye şunları söyler:
- Modeli
Movieveritabanı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:
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 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.