Bölüm 7, ASP.NET Core'da sayfaya yeni alan Razor ekleme
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
Gönderen Rick Anderson
Bu bölümde Entity Framework Core (EF Core), uygulamanın model sınıfına göre veritabanı şemasını tanımlamak için kullanılır:
- Modele yeni bir alan ekleyin.
- Yeni alan şeması değişikliğini veritabanına geçirin.
Bu EF Core yaklaşım daha çevik bir geliştirme sürecine olanak tanır. Geliştirici, veritabanı şeması oluşturulurken ve ardından eşitlenirken, geliştiricinin bağlamları bir datbase yönetim aracına veya aracından geçirmesi gerekmeden doğrudan uygulamanın veri modeli üzerinde çalışır. Entity Framework Core'a ve avantajlarına genel bakış için bkz . Entity Framework Core.
Otomatik olarak veritabanı oluşturmak ve izlemek için EF Code kullanma:
- Veritabanının şemasının oluşturulduğu model sınıflarıyla eşitlenip eşitlenmediğini izlemek için veritabanına bir
__EFMigrationsHistory
tablo ekler. - Model sınıfları veritabanıyla eşitlenmemişse bir özel durum oluşturur.
Şema ve modelin eşitlenmiş olduğunu otomatik doğrulama, tutarsız veritabanı kodu sorunlarını bulmayı kolaylaştırır.
Film Modeline Derecelendirme Özelliği Ekleme
Models/Movie.cs
Dosyayı açın ve birRating
özellik ekleyin:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
öğesini düzenleyin
Pages/Movies/Index.cshtml
ve birRating
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> <label>Title: <input type="text" asp-for="SearchString" /></label> <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
Rating
alanla güncelleştirin:
Veritabanı yeni alanı içerecek şekilde güncelleştirilene kadar uygulama çalışmaz. Veritabanını güncelleştirmeden uygulamayı çalıştırmak bir SqlException
oluşturur:
SqlException: Invalid column name 'Rating'.
Özel SqlException
durum, güncelleştirilmiş Movie model sınıfının veritabanının Movie tablosunun şemasından farklı olmasından kaynaklanır. Veritabanı tablosunda sütun yok Rating
.
Hatayı çözmek için birkaç yaklaşım vardır:
- Entity Framework'ün yeni model sınıfı şemasını kullanarak veritabanını otomatik olarak bırakmasını ve yeniden oluşturmasını sağlayın. Bu yaklaşım geliştirme döngüsünün erken dönemlerinde kullanışlıdır ve geliştiricilerin model ve veritabanı şemasını birlikte hızla geliştirmesine olanak tanır. Bunun dezavantajı, veritabanındaki mevcut verilerin kaybolmasıdır. Bu yaklaşımı üretim veritabanında kullanmayın! Veritabanını şema değişikliklerine bırakmak ve test verileriyle veritabanını otomatik olarak görmek için başlatıcı kullanmak genellikle uygulama geliştirmenin üretken bir yoludur.
- 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ı, verileri korumaktır. Bu değişikliği el ile veya veritabanı değişiklik betiği oluşturarak yapın.
- Veritabanı şemasını güncelleştirmek için Geçişler'i kullanın EF Core .
Bu öğretici için Geçişler'i kullanın EF Core .
sınıfını SeedData
yeni sütun için bir değer sağlayacak şekilde güncelleştirin. Aşağıda örnek bir değişiklik gösterilir, ancak her new Movie
blok için bu değişikliği yapın.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Tamamlanmış SeedData.cs dosyasına bakın.
Uygulamayı oluşturma
Ctrl+Shift B tuşlarına basın +
Derecelendirme alanı için geçiş ekleme
Araçlar menüsünde NuGet Paket Yöneticisi Paket Yöneticisi > Konsolu'nu seçin.
Paket Yöneticisi Konsolu'nda (PMC) aşağıdaki komutu girin:
Add-Migration Rating
komutu, Add-Migration
çerçeveye şunu söyler:
Movie
Modeli veritabanı şemasıylaMovie
karşılaştırın.- Veritabanı şemasını yeni modele geçirmek için kod oluşturun.
"Derecelendirme" adı rastgeledir ve geçiş dosyasını adlandırmak için kullanılır. Geçiş dosyası için anlamlı bir ad kullanmak yararlı olur.
PMC'de aşağıdaki komutu girin:
Update-Database
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ı sildiğinizde, başlatıcı veritabanının tohumunu oluşturur ve alanını ekler Rating
. Silme işlemi, tarayıcıdaki veya Sql Server Nesne Gezgini'ndeki (SSOX) silme bağlantıları ile yapılabilir.
Bir diğer seçenek de veritabanını silmek ve veritabanını yeniden oluşturmak için geçişleri kullanmaktır. SSOX'ta veritabanını silmek için:
Uygulamayı çalıştırın ve bir Rating
alanla film oluşturabildiğinizi, düzenleyebildiğinizi ve görüntüleyebildiğinizi doğrulayın. Veritabanı tohumlanmamışsa yönteminde SeedData.Initialize
bir kesme noktası ayarlayın.
Sonraki adımlar
Bu bölümde Entity Framework Kodu İlk Geçişler şunları yapmak için kullanılır:
- Modele yeni bir alan ekleyin.
- Yeni alan şeması değişikliğini veritabanına geçirin.
Otomatik olarak veritabanı oluşturmak ve izlemek için EF Code First kullanırken Code First:
- Veritabanının şemasının oluşturulduğu model sınıflarıyla eşitlenip eşitlenmediğini izlemek için veritabanına bir
__EFMigrationsHistory
tablo ekler. - Model sınıfları veritabanıyla eşitlenmemişse bir özel durum oluşturur.
Şema ve modelin eşitlenmiş olduğunu otomatik doğrulama, tutarsız veritabanı kodu sorunlarını bulmayı kolaylaştırır.
Film Modeline Derecelendirme Özelliği Ekleme
Models/Movie.cs
Dosyayı açın ve birRating
özellik ekleyin:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
öğesini düzenleyin
Pages/Movies/Index.cshtml
ve birRating
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> <label>Title: <input type="text" asp-for="SearchString" /></label> <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
Rating
alanla güncelleştirin:
Veritabanı yeni alanı içerecek şekilde güncelleştirilene kadar uygulama çalışmaz. Veritabanını güncelleştirmeden uygulamayı çalıştırmak bir SqlException
oluşturur:
SqlException: Invalid column name 'Rating'.
Özel SqlException
durum, güncelleştirilmiş Movie model sınıfının veritabanının Movie tablosunun şemasından farklı olmasından kaynaklanır. Veritabanı tablosunda sütun yok Rating
.
Hatayı çözmek için birkaç yaklaşım vardır:
- Entity Framework'ün yeni model sınıfı şemasını kullanarak veritabanını otomatik olarak bırakmasını ve yeniden oluşturmasını sağlayın. Bu yaklaşım geliştirme döngüsünün erken dönemlerinde kullanışlıdır ve geliştiricilerin model ve veritabanı şemasını birlikte hızla geliştirmesine olanak tanır. Bunun dezavantajı, veritabanındaki mevcut verilerin kaybolmasıdır. Bu yaklaşımı üretim veritabanında kullanmayın! Veritabanını şema değişikliklerine bırakmak ve test verileriyle veritabanını otomatik olarak görmek için başlatıcı kullanmak genellikle uygulama geliştirmenin üretken bir yoludur.
- 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ı, verileri korumaktır. Bu değişikliği el ile veya 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.
sınıfını SeedData
yeni sütun için bir değer sağlayacak şekilde güncelleştirin. Aşağıda örnek bir değişiklik gösterilir, ancak her new Movie
blok için bu değişikliği yapın.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Tamamlanmış SeedData.cs dosyasına bakın.
Uygulamayı oluşturma
Ctrl+Shift B tuşlarına basın +
Derecelendirme alanı için geçiş ekleme
Araçlar menüsünde NuGet Paket Yöneticisi Paket Yöneticisi > Konsolu'nu seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration Rating Update-Database
komutu, Add-Migration
çerçeveye şunu söyler:
Movie
Modeli veritabanı şemasıylaMovie
karşılaştırın.- Veritabanı şemasını yeni modele geçirmek için kod oluşturun.
"Derecelendirme" adı rastgeledir ve geçiş dosyasını adlandırmak için 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ı sildiğinizde, başlatıcı veritabanının tohumunu oluşturur ve alanını ekler Rating
. Silme işlemi, tarayıcıdaki veya Sql Server Nesne Gezgini'ndeki (SSOX) silme bağlantıları ile yapılabilir.
Bir diğer seçenek de veritabanını silmek ve veritabanını yeniden oluşturmak için geçişleri kullanmaktır. SSOX'ta veritabanını silmek için:
Uygulamayı çalıştırın ve bir Rating
alanla film oluşturabildiğinizi, düzenleyebildiğinizi ve görüntüleyebildiğinizi doğrulayın. Veritabanı tohumlanmamışsa yönteminde SeedData.Initialize
bir kesme noktası ayarlayın.
Sonraki adımlar
Bu bölümde Entity Framework Kodu İlk Geçişler şunları yapmak için kullanılır:
- Modele yeni bir alan ekleyin.
- Yeni alan şeması değişikliğini veritabanına geçirin.
Otomatik olarak veritabanı oluşturmak ve izlemek için EF Code First kullanırken Code First:
- Veritabanının şemasının oluşturulduğu model sınıflarıyla eşitlenip eşitlenmediğini izlemek için veritabanına bir
__EFMigrationsHistory
tablo ekler. - Model sınıfları veritabanıyla eşitlenmemişse bir özel durum oluşturur.
Şema ve modelin eşitlenmiş olduğunu otomatik doğrulama, tutarsız veritabanı kodu sorunlarını bulmayı kolaylaştırır.
Film Modeline Derecelendirme Özelliği Ekleme
Models/Movie.cs
Dosyayı açın ve birRating
özellik ekleyin:public class Movie { public int Id { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
öğesini düzenleyin
Pages/Movies/Index.cshtml
ve birRating
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> <label>Title: <input type="text" asp-for="SearchString" /></label> <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
Rating
alanla güncelleştirin:
Veritabanı yeni alanı içerecek şekilde güncelleştirilene kadar uygulama çalışmaz. Veritabanını güncelleştirmeden uygulamayı çalıştırmak bir SqlException
oluşturur:
SqlException: Invalid column name 'Rating'.
Özel SqlException
durum, güncelleştirilmiş Movie model sınıfının veritabanının Movie tablosunun şemasından farklı olmasından kaynaklanır. Veritabanı tablosunda sütun yok Rating
.
Hatayı çözmek için birkaç yaklaşım vardır:
- Entity Framework'ün yeni model sınıfı şemasını kullanarak veritabanını otomatik olarak bırakmasını ve yeniden oluşturmasını sağlayın. Bu yaklaşım geliştirme döngüsünün erken dönemlerinde kullanışlıdır ve geliştiricilerin model ve veritabanı şemasını birlikte hızla geliştirmesine olanak tanır. Bunun dezavantajı, veritabanındaki mevcut verilerin kaybolmasıdır. Bu yaklaşımı üretim veritabanında kullanmayın! Veritabanını şema değişikliklerine bırakmak ve test verileriyle veritabanını otomatik olarak görmek için başlatıcı kullanmak genellikle uygulama geliştirmenin üretken bir yoludur.
- 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ı, verileri korumaktır. Bu değişikliği el ile veya 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.
sınıfını SeedData
yeni sütun için bir değer sağlayacak şekilde güncelleştirin. Aşağıda örnek bir değişiklik gösterilir, ancak her new Movie
blok için bu değişikliği yapın.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Tamamlanmış SeedData.cs dosyasına bakın.
Uygulamayı oluşturma
Ctrl+Shift B tuşlarına basın +
Derecelendirme alanı için geçiş ekleme
Araçlar menüsünde NuGet Paket Yöneticisi Paket Yöneticisi > Konsolu'nu seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration Rating Update-Database
komutu, Add-Migration
çerçeveye şunu söyler:
Movie
Modeli veritabanı şemasıylaMovie
karşılaştırın.- Veritabanı şemasını yeni modele geçirmek için kod oluşturun.
"Derecelendirme" adı rastgeledir ve geçiş dosyasını adlandırmak için 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ı sildiğinizde, başlatıcı veritabanının tohumunu oluşturur ve alanını ekler Rating
. Silme işlemi, tarayıcıdaki veya Sql Server Nesne Gezgini'ndeki (SSOX) silme bağlantıları ile yapılabilir.
Bir diğer seçenek de veritabanını silmek ve veritabanını yeniden oluşturmak için geçişleri kullanmaktır. SSOX'ta veritabanını silmek için:
Uygulamayı çalıştırın ve bir Rating
alanla film oluşturabildiğinizi, düzenleyebildiğinizi ve görüntüleyebildiğinizi doğrulayın. Veritabanı tohumlanmamışsa yönteminde SeedData.Initialize
bir kesme noktası ayarlayın.
Sonraki adımlar
Bu bölümde Entity Framework Kodu İlk Geçişler şunları yapmak için kullanılır:
- Modele yeni bir alan ekleyin.
- Yeni alan şeması değişikliğini veritabanına geçirin.
Otomatik olarak veritabanı oluşturmak ve izlemek için EF Code First kullanırken Code First:
- Veritabanının şemasının oluşturulduğu model sınıflarıyla eşitlenip eşitlenmediğini izlemek için veritabanına bir
__EFMigrationsHistory
tablo ekler. - Model sınıfları veritabanıyla eşitlenmemişse bir özel durum oluşturur.
Şema ve modelin eşitlenmiş olduğunu otomatik doğrulama, tutarsız veritabanı kodu sorunlarını bulmayı kolaylaştırır.
Film Modeline Derecelendirme Özelliği Ekleme
Models/Movie.cs
Dosyayı açın ve birRating
özellik ekleyin:public class Movie { public int ID { get; set; } public string Title { get; set; } = string.Empty; [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } public string Rating { get; set; } = string.Empty; }
öğesini düzenleyin
Pages/Movies/Index.cshtml
ve birRating
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> <label>Title: <input type="text" asp-for="SearchString" /></label> <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
Rating
alanla güncelleştirin:
Veritabanı yeni alanı içerecek şekilde güncelleştirilene kadar uygulama çalışmaz. Veritabanını güncelleştirmeden uygulamayı çalıştırmak bir SqlException
oluşturur:
SqlException: Invalid column name 'Rating'.
Özel SqlException
durum, güncelleştirilmiş Movie model sınıfının veritabanının Movie tablosunun şemasından farklı olmasından kaynaklanır. Veritabanı tablosunda sütun yok Rating
.
Hatayı çözmek için birkaç yaklaşım vardır:
- Entity Framework'ün yeni model sınıfı şemasını kullanarak veritabanını otomatik olarak bırakmasını ve yeniden oluşturmasını sağlayın. Bu yaklaşım geliştirme döngüsünün erken dönemlerinde kullanışlıdır ve geliştiricilerin model ve veritabanı şemasını birlikte hızla geliştirmesine olanak tanır. Bunun dezavantajı, veritabanındaki mevcut verilerin kaybolmasıdır. Bu yaklaşımı üretim veritabanında kullanmayın! Veritabanını şema değişikliklerine bırakmak ve test verileriyle veritabanını otomatik olarak görmek için başlatıcı kullanmak genellikle uygulama geliştirmenin üretken bir yoludur.
- 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ı, verileri korumaktır. Bu değişikliği el ile veya 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.
sınıfını SeedData
yeni sütun için bir değer sağlayacak şekilde güncelleştirin. Aşağıda örnek bir değişiklik gösterilir, ancak her new Movie
blok için bu değişikliği yapın.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Tamamlanmış SeedData.cs dosyasına bakın.
Çözümü oluşturun.
Derecelendirme alanı için geçiş ekleme
Araçlar menüsünde NuGet Paket Yöneticisi Paket Yöneticisi > Konsolu'nu seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration Rating Update-Database
komutu, Add-Migration
çerçeveye şunu söyler:
Movie
Modeli veritabanı şemasıylaMovie
karşılaştırın.- Veritabanı şemasını yeni modele geçirmek için kod oluşturun.
"Derecelendirme" adı rastgeledir ve geçiş dosyasını adlandırmak için 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ı sildiğinizde, başlatıcı veritabanının tohumunu oluşturur ve alanını ekler Rating
. Silme işlemi, tarayıcıdaki veya Sql Server Nesne Gezgini'ndeki (SSOX) silme bağlantıları ile yapılabilir.
Bir diğer seçenek de veritabanını silmek ve veritabanını yeniden oluşturmak için geçişleri kullanmaktır. SSOX'ta veritabanını silmek için:
Uygulamayı çalıştırın ve bir Rating
alanla film oluşturabildiğinizi, düzenleyebildiğinizi ve görüntüleyebildiğinizi doğrulayın. Veritabanı tohumlanmamışsa yönteminde SeedData.Initialize
bir kesme noktası ayarlayın.
Sonraki adımlar
Örnek kodu görüntüleme veya indirme (indirme).
Bu bölümde Entity Framework Kodu İlk Geçişler şunları yapmak için kullanılır:
- Modele yeni bir alan ekleyin.
- Yeni alan şeması değişikliğini veritabanına geçirin.
Otomatik olarak veritabanı oluşturmak için EF Code First kullanırken Code First:
- Veritabanının şemasının oluşturulduğu model sınıflarıyla eşitlenip eşitlenmediğini izlemek için veritabanına bir
__EFMigrationsHistory
tablo ekler. - Model sınıfları veritabanıyla eşitlenmemişse EF bir özel durum oluşturur.
Şema ve modelin eşitlenmiş olduğunu otomatik doğrulama, tutarsız veritabanı kodu sorunlarını bulmayı kolaylaştırır.
Film Modeline Derecelendirme Özelliği Ekleme
Models/Movie.cs
Dosyayı açın ve birRating
özellik 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; } }
Uygulamayı oluşturun.
öğesini düzenleyin
Pages/Movies/Index.cshtml
ve birRating
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> <label>Title: <input type="text" asp-for="SearchString" /></label> <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
Rating
alanla güncelleştirin:
Veritabanı yeni alanı içerecek şekilde güncelleştirilene kadar uygulama çalışmaz. Veritabanını güncelleştirmeden uygulamayı çalıştırmak bir SqlException
oluşturur:
SqlException: Invalid column name 'Rating'.
Özel SqlException
durum, güncelleştirilmiş Movie model sınıfının veritabanının Movie tablosunun şemasından farklı olmasından kaynaklanır. Veritabanı tablosunda sütun yok Rating
.
Hatayı çözmek için birkaç yaklaşım vardır:
Entity Framework'ün yeni model sınıfı şemasını kullanarak veritabanını otomatik olarak bırakmasını ve yeniden oluşturmasını sağlayın. Bu yaklaşım geliştirme döngüsünün erken dönemlerinde kullanışlıdır ve model ve veritabanı şemasını birlikte hızla geliştirmenizi sağlar. Bunun dezavantajı, veritabanındaki mevcut verileri kaybetmenizdir. Bu yaklaşımı üretim veritabanında kullanmayın! Veritabanını şema değişikliklerine bırakmak ve test verileriyle veritabanını otomatik olarak görmek için başlatıcı kullanmak genellikle uygulama geliştirmenin üretken bir yoludur.
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ı, verileri korumaktır. Bu değişikliği el ile veya 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.
sınıfını SeedData
yeni sütun için bir değer sağlayacak şekilde güncelleştirin. Aşağıda örnek bir değişiklik gösterilir, ancak her new Movie
blok için bu değişikliği yapın.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Tamamlanmış SeedData.cs dosyasına bakın.
Çözümü oluşturun.
Derecelendirme alanı için geçiş ekleme
Araçlar menüsünde NuGet Paket Yöneticisi Paket Yöneticisi > Konsolu'nu seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration Rating Update-Database
komutu, Add-Migration
çerçeveye şunu söyler:
Movie
Modeli veritabanı şemasıylaMovie
karşılaştırın.- Veritabanı şemasını yeni modele geçirmek için kod oluşturun.
"Derecelendirme" adı rastgeledir ve geçiş dosyasını adlandırmak için 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ı sildiğinizde, başlatıcı veritabanının tohumunu oluşturur ve alanını ekler Rating
. Silme işlemi, tarayıcıdaki veya Sql Server Nesne Gezgini'ndeki (SSOX) silme bağlantıları ile yapılabilir.
Bir diğer seçenek de veritabanını silmek ve veritabanını yeniden oluşturmak için geçişleri kullanmaktır. SSOX'ta veritabanını silmek için:
Uygulamayı çalıştırın ve bir Rating
alanla film oluşturabildiğinizi/düzenleyebildiğinizi/görüntüleyebildiğinizi doğrulayın. Veritabanı tohumlanmamışsa yönteminde SeedData.Initialize
bir kesme noktası ayarlayın.
Sonraki adımlar
Örnek kodu görüntüleme veya indirme (indirme).
Bu bölümde Entity Framework Kodu İlk Geçişler şunları yapmak için kullanılır:
- Modele yeni bir alan ekleyin.
- Yeni alan şeması değişikliğini veritabanına geçirin.
Otomatik olarak veritabanı oluşturmak için EF Code First kullanırken Code First:
- Veritabanının şemasının oluşturulduğu model sınıflarıyla eşitlenip eşitlenmediğini izlemek için veritabanına bir
__EFMigrationsHistory
tablo ekler. - Model sınıfları veritabanıyla eşitlenmemişse EF bir özel durum oluşturur.
Şema ve modelin eşitlenmiş olduğunu otomatik doğrulama, tutarsız veritabanı kodu sorunlarını bulmayı kolaylaştırır.
Film Modeline Derecelendirme Özelliği Ekleme
Models/Movie.cs
Dosyayı açın ve birRating
özellik 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; } }
Uygulamayı oluşturun.
öğesini düzenleyin
Pages/Movies/Index.cshtml
ve birRating
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> <label>Title: <input type="text" asp-for="SearchString" /></label> <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
Rating
alanla güncelleştirin:
Veritabanı yeni alanı içerecek şekilde güncelleştirilene kadar uygulama çalışmaz. Veritabanını güncelleştirmeden uygulamayı çalıştırmak bir SqlException
oluşturur:
SqlException: Invalid column name 'Rating'.
Özel SqlException
durum, güncelleştirilmiş Movie model sınıfının veritabanının Movie tablosunun şemasından farklı olmasından kaynaklanır. Veritabanı tablosunda sütun yok Rating
.
Hatayı çözmek için birkaç yaklaşım vardır:
Entity Framework'ün yeni model sınıfı şemasını kullanarak veritabanını otomatik olarak bırakmasını ve yeniden oluşturmasını sağlayın. Bu yaklaşım geliştirme döngüsünün erken dönemlerinde kullanışlıdır ve model ve veritabanı şemasını birlikte hızla geliştirmenizi sağlar. Bunun dezavantajı, veritabanındaki mevcut verileri kaybetmenizdir. Bu yaklaşımı üretim veritabanında kullanmayın! Veritabanını şema değişikliklerine bırakmak ve test verileriyle veritabanını otomatik olarak görmek için başlatıcı kullanmak genellikle uygulama geliştirmenin üretken bir yoludur.
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ı, verileri korumaktır. Bu değişikliği el ile veya 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.
sınıfını SeedData
yeni sütun için bir değer sağlayacak şekilde güncelleştirin. Aşağıda örnek bir değişiklik gösterilir, ancak her new Movie
blok için bu değişikliği yapın.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Tamamlanmış SeedData.cs dosyasına bakın.
Çözümü oluşturun.
Derecelendirme alanı için geçiş ekleme
Araçlar menüsünde NuGet Paket Yöneticisi Paket Yöneticisi > Konsolu'nu seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration Rating Update-Database
komutu, Add-Migration
çerçeveye şunu söyler:
Movie
Modeli veritabanı şemasıylaMovie
karşılaştırın.- Veritabanı şemasını yeni modele geçirmek için kod oluşturun.
"Derecelendirme" adı rastgeledir ve geçiş dosyasını adlandırmak için 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ı silerseniz, başlatıcı veritabanının tohumunu oluşturur ve alanını ekler Rating
. Bunu, tarayıcıdaki veya Sql Server Nesne Gezgini'ndeki (SSOX) silme bağlantılarıyla yapabilirsiniz.
Bir diğer seçenek de veritabanını silmek ve veritabanını yeniden oluşturmak için geçişleri kullanmaktır. SSOX'ta veritabanını silmek için:
Uygulamayı çalıştırın ve bir Rating
alanla film oluşturabildiğinizi/düzenleyebildiğinizi/görüntüleyebildiğinizi doğrulayın. Veritabanı tohumlanmamışsa yönteminde SeedData.Initialize
bir kesme noktası ayarlayın.
Sonraki adımlar
ASP.NET Core