Bölüm 7, ASP.NET Core'da sayfaya yeni alan Razor ekleme
Gönderen Rick Anderson
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> 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
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> 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
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> 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
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> 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
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> 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
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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin