Teil 7: Hinzufügen eines neuen Felds zu einer Razor-Seite in ASP.NET Core
Hinweis
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.
Warnung
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.
Wichtig
Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.
Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.
Von Rick Anderson
In diesem Abschnitt wird Entity Framework Core (EF Core) verwendet, um das Datenbankschema basierend auf der Modellklasse der App zu definieren:
- Dem Modell wird ein neues Feld hinzugefügt.
- Die neue Änderung am Feldschema wird in die Datenbank migriert.
Der EF Core Ansatz ermöglicht einen agileren Entwicklungsprozess. Der Entwickler arbeitet direkt am Datenmodell der App, während das Datenbankschema erstellt und dann synchronisiert wird, ohne dass der Entwickler Kontexte zu und von einem Datbase-Verwaltungstool wechseln muss. Eine Übersicht über Entity Framework Core und deren Vorteile finden Sie unter Entity Framework Core.
Verwenden von EF Code zum automatischen Erstellen und Nachverfolgen einer Datenbank:
- Es fügt der Datenbank eine
__EFMigrationsHistory
-Tabelle hinzu, um nachzuverfolgen, ob das Schema der Datenbank mit den Modellklassen synchron ist, aus denen sie generiert wurde. - Wenn die Datenbank mit den Modellklassen nicht synchron ist, wird eine Ausnahme ausgelöst.
Durch die automatische Überprüfung, ob Schema und Modell synchron sind, können Probleme aufgrund inkonsistenter Datenbankencodes leichter ermittelt werden.
Hinzufügen einer Rating-Eigenschaft zum Movie-Modell
Öffnen Sie die Datei
Models/Movie.cs
, und fügen Sie eineRating
-Eigenschaft hinzu: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; }
Bearbeiten Sie
Pages/Movies/Index.cshtml
, und fügen Sie ein FeldRating
hinzu:@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>
Aktualisieren Sie die folgenden Seiten mit einem
Rating
-Feld:
Die App funktioniert erst, nachdem die Datenbank so aktualisiert wurde, dass sie das neue Feld enthält. Wenn Sie die App ohne eine Aktualisierung der Datenbank ausführen, wird eine SqlException
ausgelöst:
SqlException: Invalid column name 'Rating'.
Die SqlException
-Ausnahme wird dadurch verursacht, dass sich die aktualisierte Modellklasse „Movie“ vom Schema der Tabelle „Movie“ der Datenbank unterscheidet. Die Datenbanktabelle enthält nicht die Spalte Rating
.
Es gibt mehrere Vorgehensweisen zum Beheben des Fehlers:
- Lassen Sie die Datenbank von Entity Framework automatisch löschen und mit dem neuen Modellklassenschema neu erstellen. Dieser Ansatz ist früh im Entwicklungszyklus sehr praktisch. Er ermöglicht es Entwicklern, das Modell und das Datenbankschema schnell gemeinsam weiterzuentwickeln. Der Nachteil ist, dass in der Datenbank vorhandene Daten verloren gehen. Verwenden Sie diesen Ansatz nicht in einer Produktionsdatenbank! Das Löschen der Datenbank bei Schemaänderungen und das Verwenden eines Initialisierers zum automatischen Ausführen eines Seedings für eine Datenbank mit Testdaten ist häufig eine produktive Möglichkeit zum Entwickeln einer App.
- Ändern Sie das Schema der vorhandenen Datenbank explizit so, dass es mit den Modellklassen übereinstimmt. Der Vorteil dieses Ansatzes ist, dass Sie Ihre Daten behalten. Sie können diese Änderung entweder manuell oder durch Erstellen eines Skripts zur Änderung der Datenbank vornehmen.
- Verwenden Sie EF Core Migrationen, um das Datenbankschema zu aktualisieren.
Verwenden Sie EF Core für dieses Lernprogramm Migrationen.
Aktualisieren Sie die SeedData
-Klasse so, dass sie einen Wert für die neue Spalte bereitstellt. Eine Beispieländerung ist nachstehend gezeigt. Nehmen Sie diese Änderung jedoch für jeden new Movie
-Block vor.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Sehen Sie sich die fertige SeedData.cs-Datei an.
Erstellen der App
Drücken Sie STRG+UMSCHALT+B
Hinzufügen einer Migration für das Bewertungsfeld
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager > Paket-Manager-Konsole aus.
Geben Sie in der Paket-Manager-Konsole (PMC) den folgenden Befehl ein:
Add-Migration Rating
Der Add-Migration
-Befehl weist das Framework an, Folgendes auszuführen:
- Das Modell
Movie
mit dem Schema der DatenbankMovie
vergleichen. - Erstellen von Code, um das Schema der Datenbank in das neue Modell zu migrieren
Der Name „Rating“ ist beliebig und wird verwendet, um die Migrationsdatei zu benennen. Es ist hilfreich, einen aussagekräftigen Namen für die Migrationsdatei zu verwenden.
Geben Sie in der PMC den folgenden Befehl ein:
Update-Database
Der Update-Database
-Befehl weist das Framework an, die Schemaänderungen auf die Datenbank anzuwenden und vorhandene Daten beizubehalten.
Löschen Sie alle Datensätze aus der Datenbank. Dann führt der Initialisierer ein Seeding für die Datenbank aus und fügt das Feld Rating
hinzu. Dies ist über die Option „Löschen“ im Browser oder über SQL Server-Objekt-Explorer (SSOX) möglich.
Eine weitere Möglichkeit ist, die Datenbank zu löschen und Migrationen zu verwenden, um die Datenbank neu zu erstellen. So löschen Sie die Datenbank in SSOX
Wählen Sie die Datenbank in SSOX aus.
Klicken Sie mit der rechten Maustaste auf die Datenbank, und wählen Sie Löschen aus.
Aktivieren Sie Vorhandene Verbindungen schließen.
Klicken Sie auf OK.
Aktualisieren Sie die Datenbank in PMC:
Update-Database
Führen Sie die App aus, und überprüfen Sie, ob Sie Filme mit dem Feld Rating
erstellen, bearbeiten und anzeigen können. Wenn für die Datenbank kein Seed ausgeführt wird, legen Sie einen Haltepunkt in der SeedData.Initialize
-Methode fest.
Nächste Schritte
In diesem Abschnitt werden Entity Framework Code First-Migrationen für folgende Zwecke verwendet:
- Dem Modell wird ein neues Feld hinzugefügt.
- Die neue Änderung am Feldschema wird in die Datenbank migriert.
Bei der Verwendung von EF Code First für die automatische Erstellung und Nachverfolgung einer Datenbank geht Code First wie folgt vor:
- Es fügt der Datenbank eine
__EFMigrationsHistory
-Tabelle hinzu, um nachzuverfolgen, ob das Schema der Datenbank mit den Modellklassen synchron ist, aus denen sie generiert wurde. - Wenn die Datenbank mit den Modellklassen nicht synchron ist, wird eine Ausnahme ausgelöst.
Durch die automatische Überprüfung, ob Schema und Modell synchron sind, können Probleme aufgrund inkonsistenter Datenbankencodes leichter ermittelt werden.
Hinzufügen einer Rating-Eigenschaft zum Movie-Modell
Öffnen Sie die Datei
Models/Movie.cs
, und fügen Sie eineRating
-Eigenschaft hinzu: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; }
Bearbeiten Sie
Pages/Movies/Index.cshtml
, und fügen Sie ein FeldRating
hinzu:@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>
Aktualisieren Sie die folgenden Seiten mit einem
Rating
-Feld:
Die App funktioniert erst, nachdem die Datenbank so aktualisiert wurde, dass sie das neue Feld enthält. Wenn Sie die App ohne eine Aktualisierung der Datenbank ausführen, wird eine SqlException
ausgelöst:
SqlException: Invalid column name 'Rating'.
Die SqlException
-Ausnahme wird dadurch verursacht, dass sich die aktualisierte Modellklasse „Movie“ vom Schema der Tabelle „Movie“ der Datenbank unterscheidet. Die Datenbanktabelle enthält nicht die Spalte Rating
.
Es gibt mehrere Vorgehensweisen zum Beheben des Fehlers:
- Lassen Sie die Datenbank von Entity Framework automatisch löschen und mit dem neuen Modellklassenschema neu erstellen. Dieser Ansatz ist früh im Entwicklungszyklus sehr praktisch. Er ermöglicht es Entwicklern, das Modell und das Datenbankschema schnell gemeinsam weiterzuentwickeln. Der Nachteil ist, dass in der Datenbank vorhandene Daten verloren gehen. Verwenden Sie diesen Ansatz nicht in einer Produktionsdatenbank! Das Löschen der Datenbank bei Schemaänderungen und das Verwenden eines Initialisierers zum automatischen Ausführen eines Seedings für eine Datenbank mit Testdaten ist häufig eine produktive Möglichkeit zum Entwickeln einer App.
- Ändern Sie das Schema der vorhandenen Datenbank explizit so, dass es mit den Modellklassen übereinstimmt. Der Vorteil dieses Ansatzes ist, dass Sie Ihre Daten behalten. Sie können diese Änderung entweder manuell oder durch Erstellen eines Skripts zur Änderung der Datenbank vornehmen.
- Verwenden Sie Code First-Migrationen, um das Datenbankschema zu aktualisieren.
Verwenden Sie für dieses Tutorial Code First-Migrationen.
Aktualisieren Sie die SeedData
-Klasse so, dass sie einen Wert für die neue Spalte bereitstellt. Eine Beispieländerung ist nachstehend gezeigt. Nehmen Sie diese Änderung jedoch für jeden new Movie
-Block vor.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Sehen Sie sich die fertige SeedData.cs-Datei an.
Erstellen der App
Drücken Sie STRG+UMSCHALT+B
Hinzufügen einer Migration für das Bewertungsfeld
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager > Paket-Manager-Konsole aus.
Geben Sie in der PMC die folgenden Befehle ein:
Add-Migration Rating Update-Database
Der Add-Migration
-Befehl weist das Framework an, Folgendes auszuführen:
- Das Modell
Movie
mit dem Schema der DatenbankMovie
vergleichen. - Erstellen von Code, um das Schema der Datenbank in das neue Modell zu migrieren
Der Name „Rating“ ist beliebig und wird verwendet, um die Migrationsdatei zu benennen. Es ist hilfreich, einen aussagekräftigen Namen für die Migrationsdatei zu verwenden.
Der Update-Database
-Befehl weist das Framework an, die Schemaänderungen auf die Datenbank anzuwenden und vorhandene Daten beizubehalten.
Löschen Sie alle Datensätze aus der Datenbank. Dann führt der Initialisierer ein Seeding für die Datenbank aus und fügt das Feld Rating
hinzu. Dies ist über die Option „Löschen“ im Browser oder über SQL Server-Objekt-Explorer (SSOX) möglich.
Eine weitere Möglichkeit ist, die Datenbank zu löschen und Migrationen zu verwenden, um die Datenbank neu zu erstellen. So löschen Sie die Datenbank in SSOX
Wählen Sie die Datenbank in SSOX aus.
Klicken Sie mit der rechten Maustaste auf die Datenbank, und wählen Sie Löschen aus.
Aktivieren Sie Vorhandene Verbindungen schließen.
Klicken Sie auf OK.
Aktualisieren Sie die Datenbank in PMC:
Update-Database
Führen Sie die App aus, und überprüfen Sie, ob Sie Filme mit dem Feld Rating
erstellen, bearbeiten und anzeigen können. Wenn für die Datenbank kein Seed ausgeführt wird, legen Sie einen Haltepunkt in der SeedData.Initialize
-Methode fest.
Nächste Schritte
In diesem Abschnitt werden Entity Framework Code First-Migrationen für folgende Zwecke verwendet:
- Dem Modell wird ein neues Feld hinzugefügt.
- Die neue Änderung am Feldschema wird in die Datenbank migriert.
Bei der Verwendung von EF Code First für die automatische Erstellung und Nachverfolgung einer Datenbank geht Code First wie folgt vor:
- Es fügt der Datenbank eine
__EFMigrationsHistory
-Tabelle hinzu, um nachzuverfolgen, ob das Schema der Datenbank mit den Modellklassen synchron ist, aus denen sie generiert wurde. - Wenn die Datenbank mit den Modellklassen nicht synchron ist, wird eine Ausnahme ausgelöst.
Durch die automatische Überprüfung, ob Schema und Modell synchron sind, können Probleme aufgrund inkonsistenter Datenbankencodes leichter ermittelt werden.
Hinzufügen einer Rating-Eigenschaft zum Movie-Modell
Öffnen Sie die Datei
Models/Movie.cs
, und fügen Sie eineRating
-Eigenschaft hinzu: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; }
Bearbeiten Sie
Pages/Movies/Index.cshtml
, und fügen Sie ein FeldRating
hinzu:@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>
Aktualisieren Sie die folgenden Seiten mit einem
Rating
-Feld:
Die App funktioniert erst, nachdem die Datenbank so aktualisiert wurde, dass sie das neue Feld enthält. Wenn Sie die App ohne eine Aktualisierung der Datenbank ausführen, wird eine SqlException
ausgelöst:
SqlException: Invalid column name 'Rating'.
Die SqlException
-Ausnahme wird dadurch verursacht, dass sich die aktualisierte Modellklasse „Movie“ vom Schema der Tabelle „Movie“ der Datenbank unterscheidet. Die Datenbanktabelle enthält nicht die Spalte Rating
.
Es gibt mehrere Vorgehensweisen zum Beheben des Fehlers:
- Lassen Sie die Datenbank von Entity Framework automatisch löschen und mit dem neuen Modellklassenschema neu erstellen. Dieser Ansatz ist früh im Entwicklungszyklus sehr praktisch. Er ermöglicht es Entwicklern, das Modell und das Datenbankschema schnell gemeinsam weiterzuentwickeln. Der Nachteil ist, dass in der Datenbank vorhandene Daten verloren gehen. Verwenden Sie diesen Ansatz nicht in einer Produktionsdatenbank! Das Löschen der Datenbank bei Schemaänderungen und das Verwenden eines Initialisierers zum automatischen Ausführen eines Seedings für eine Datenbank mit Testdaten ist häufig eine produktive Möglichkeit zum Entwickeln einer App.
- Ändern Sie das Schema der vorhandenen Datenbank explizit so, dass es mit den Modellklassen übereinstimmt. Der Vorteil dieses Ansatzes ist, dass Sie Ihre Daten behalten. Sie können diese Änderung entweder manuell oder durch Erstellen eines Skripts zur Änderung der Datenbank vornehmen.
- Verwenden Sie Code First-Migrationen, um das Datenbankschema zu aktualisieren.
Verwenden Sie für dieses Tutorial Code First-Migrationen.
Aktualisieren Sie die SeedData
-Klasse so, dass sie einen Wert für die neue Spalte bereitstellt. Eine Beispieländerung ist nachstehend gezeigt. Nehmen Sie diese Änderung jedoch für jeden new Movie
-Block vor.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Sehen Sie sich die fertige SeedData.cs-Datei an.
Erstellen der App
Drücken Sie STRG+UMSCHALT+B
Hinzufügen einer Migration für das Bewertungsfeld
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager > Paket-Manager-Konsole aus.
Geben Sie in der PMC die folgenden Befehle ein:
Add-Migration Rating Update-Database
Der Add-Migration
-Befehl weist das Framework an, Folgendes auszuführen:
- Das Modell
Movie
mit dem Schema der DatenbankMovie
vergleichen. - Erstellen von Code, um das Schema der Datenbank in das neue Modell zu migrieren
Der Name „Rating“ ist beliebig und wird verwendet, um die Migrationsdatei zu benennen. Es ist hilfreich, einen aussagekräftigen Namen für die Migrationsdatei zu verwenden.
Der Update-Database
-Befehl weist das Framework an, die Schemaänderungen auf die Datenbank anzuwenden und vorhandene Daten beizubehalten.
Löschen Sie alle Datensätze aus der Datenbank. Dann führt der Initialisierer ein Seeding für die Datenbank aus und fügt das Feld Rating
hinzu. Dies ist über die Option „Löschen“ im Browser oder über SQL Server-Objekt-Explorer (SSOX) möglich.
Eine weitere Möglichkeit ist, die Datenbank zu löschen und Migrationen zu verwenden, um die Datenbank neu zu erstellen. So löschen Sie die Datenbank in SSOX
Wählen Sie die Datenbank in SSOX aus.
Klicken Sie mit der rechten Maustaste auf die Datenbank, und wählen Sie Löschen aus.
Aktivieren Sie Vorhandene Verbindungen schließen.
Klicken Sie auf OK.
Aktualisieren Sie die Datenbank in PMC:
Update-Database
Führen Sie die App aus, und überprüfen Sie, ob Sie Filme mit dem Feld Rating
erstellen, bearbeiten und anzeigen können. Wenn für die Datenbank kein Seed ausgeführt wird, legen Sie einen Haltepunkt in der SeedData.Initialize
-Methode fest.
Nächste Schritte
In diesem Abschnitt werden Entity Framework Code First-Migrationen für folgende Zwecke verwendet:
- Dem Modell wird ein neues Feld hinzugefügt.
- Die neue Änderung am Feldschema wird in die Datenbank migriert.
Bei der Verwendung von EF Code First für die automatische Erstellung und Nachverfolgung einer Datenbank geht Code First wie folgt vor:
- Es fügt der Datenbank eine
__EFMigrationsHistory
-Tabelle hinzu, um nachzuverfolgen, ob das Schema der Datenbank mit den Modellklassen synchron ist, aus denen sie generiert wurde. - Wenn die Datenbank mit den Modellklassen nicht synchron ist, wird eine Ausnahme ausgelöst.
Durch die automatische Überprüfung, ob Schema und Modell synchron sind, können Probleme aufgrund inkonsistenter Datenbankencodes leichter ermittelt werden.
Hinzufügen einer Rating-Eigenschaft zum Movie-Modell
Öffnen Sie die Datei
Models/Movie.cs
, und fügen Sie eineRating
-Eigenschaft hinzu: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; }
Bearbeiten Sie
Pages/Movies/Index.cshtml
, und fügen Sie ein FeldRating
hinzu:@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>
Aktualisieren Sie die folgenden Seiten mit einem
Rating
-Feld:
Die App funktioniert erst, nachdem die Datenbank so aktualisiert wurde, dass sie das neue Feld enthält. Wenn Sie die App ohne eine Aktualisierung der Datenbank ausführen, wird eine SqlException
ausgelöst:
SqlException: Invalid column name 'Rating'.
Die SqlException
-Ausnahme wird dadurch verursacht, dass sich die aktualisierte Modellklasse „Movie“ vom Schema der Tabelle „Movie“ der Datenbank unterscheidet. Die Datenbanktabelle enthält nicht die Spalte Rating
.
Es gibt mehrere Vorgehensweisen zum Beheben des Fehlers:
- Lassen Sie die Datenbank von Entity Framework automatisch löschen und mit dem neuen Modellklassenschema neu erstellen. Dieser Ansatz ist früh im Entwicklungszyklus sehr praktisch. Er ermöglicht es Entwicklern, das Modell und das Datenbankschema schnell gemeinsam weiterzuentwickeln. Der Nachteil ist, dass in der Datenbank vorhandene Daten verloren gehen. Verwenden Sie diesen Ansatz nicht in einer Produktionsdatenbank! Das Löschen der Datenbank bei Schemaänderungen und das Verwenden eines Initialisierers zum automatischen Ausführen eines Seedings für eine Datenbank mit Testdaten ist häufig eine produktive Möglichkeit zum Entwickeln einer App.
- Ändern Sie das Schema der vorhandenen Datenbank explizit so, dass es mit den Modellklassen übereinstimmt. Der Vorteil dieses Ansatzes ist, dass Sie Ihre Daten behalten. Sie können diese Änderung entweder manuell oder durch Erstellen eines Skripts zur Änderung der Datenbank vornehmen.
- Verwenden Sie Code First-Migrationen, um das Datenbankschema zu aktualisieren.
Verwenden Sie für dieses Tutorial Code First-Migrationen.
Aktualisieren Sie die SeedData
-Klasse so, dass sie einen Wert für die neue Spalte bereitstellt. Eine Beispieländerung ist nachstehend gezeigt. Nehmen Sie diese Änderung jedoch für jeden new Movie
-Block vor.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Sehen Sie sich die fertige SeedData.cs-Datei an.
Erstellen Sie die Projektmappe.
Hinzufügen einer Migration für das Bewertungsfeld
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager > Paket-Manager-Konsole aus.
Geben Sie in der PMC die folgenden Befehle ein:
Add-Migration Rating Update-Database
Der Add-Migration
-Befehl weist das Framework an, Folgendes auszuführen:
- Das Modell
Movie
mit dem Schema der DatenbankMovie
vergleichen. - Erstellen von Code, um das Schema der Datenbank in das neue Modell zu migrieren
Der Name „Rating“ ist beliebig und wird verwendet, um die Migrationsdatei zu benennen. Es ist hilfreich, einen aussagekräftigen Namen für die Migrationsdatei zu verwenden.
Der Update-Database
-Befehl weist das Framework an, die Schemaänderungen auf die Datenbank anzuwenden und vorhandene Daten beizubehalten.
Löschen Sie alle Datensätze aus der Datenbank. Dann führt der Initialisierer ein Seeding für die Datenbank aus und fügt das Feld Rating
hinzu. Dies ist über die Option „Löschen“ im Browser oder über SQL Server-Objekt-Explorer (SSOX) möglich.
Eine weitere Möglichkeit ist, die Datenbank zu löschen und Migrationen zu verwenden, um die Datenbank neu zu erstellen. So löschen Sie die Datenbank in SSOX
Wählen Sie die Datenbank in SSOX aus.
Klicken Sie mit der rechten Maustaste auf die Datenbank, und wählen Sie Löschen aus.
Aktivieren Sie Vorhandene Verbindungen schließen.
Klicken Sie auf OK.
Aktualisieren Sie die Datenbank in PMC:
Update-Database
Führen Sie die App aus, und überprüfen Sie, ob Sie Filme mit dem Feld Rating
erstellen, bearbeiten und anzeigen können. Wenn für die Datenbank kein Seed ausgeführt wird, legen Sie einen Haltepunkt in der SeedData.Initialize
-Methode fest.
Nächste Schritte
Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).
In diesem Abschnitt werden Entity Framework Code First-Migrationen für folgende Zwecke verwendet:
- Dem Modell wird ein neues Feld hinzugefügt.
- Die neue Änderung am Feldschema wird in die Datenbank migriert.
Bei der Verwendung von EF Code First für die automatische Erstellung einer Datenbank geht Code First wie folgt vor:
- Es fügt der Datenbank eine
__EFMigrationsHistory
-Tabelle hinzu, um nachzuverfolgen, ob das Schema der Datenbank mit den Modellklassen synchron ist, aus denen sie generiert wurde. - Wenn die Datenbank mit den Modellklassen nicht synchron ist, löst EF eine Ausnahme aus.
Durch die automatische Überprüfung, ob Schema und Modell synchron sind, können Probleme aufgrund inkonsistenter Datenbankencodes leichter ermittelt werden.
Hinzufügen einer Rating-Eigenschaft zum Movie-Modell
Öffnen Sie die Datei
Models/Movie.cs
, und fügen Sie eineRating
-Eigenschaft hinzu: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; } }
Erstellen Sie die App.
Bearbeiten Sie
Pages/Movies/Index.cshtml
, und fügen Sie ein FeldRating
hinzu:@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>
Aktualisieren Sie die folgenden Seiten mit einem
Rating
-Feld:
Die App funktioniert erst, nachdem die Datenbank so aktualisiert wurde, dass sie das neue Feld enthält. Wenn Sie die App ohne eine Aktualisierung der Datenbank ausführen, wird eine SqlException
ausgelöst:
SqlException: Invalid column name 'Rating'.
Die SqlException
-Ausnahme wird dadurch verursacht, dass sich die aktualisierte Modellklasse „Movie“ vom Schema der Tabelle „Movie“ der Datenbank unterscheidet. Die Datenbanktabelle enthält nicht die Spalte Rating
.
Es gibt mehrere Vorgehensweisen zum Beheben des Fehlers:
Lassen Sie die Datenbank von Entity Framework automatisch löschen und mit dem neuen Modellklassenschema neu erstellen. Dieser Ansatz ist früh im Entwicklungszyklus sehr praktisch. Er ermöglicht Ihnen, das Modell und das Datenbankschema schnell gemeinsam weiterzuentwickeln. Der Nachteil ist, dass in der Datenbank vorhandene Daten verloren gehen. Verwenden Sie diesen Ansatz nicht in einer Produktionsdatenbank! Das Löschen der Datenbank bei Schemaänderungen und das Verwenden eines Initialisierers zum automatischen Ausführen eines Seedings für eine Datenbank mit Testdaten ist häufig eine produktive Möglichkeit zum Entwickeln einer App.
Ändern Sie das Schema der vorhandenen Datenbank explizit so, dass es mit den Modellklassen übereinstimmt. Der Vorteil dieses Ansatzes ist, dass Sie Ihre Daten behalten. Sie können diese Änderung entweder manuell oder durch Erstellen eines Skripts zur Änderung der Datenbank vornehmen.
Verwenden Sie Code First-Migrationen, um das Datenbankschema zu aktualisieren.
Verwenden Sie für dieses Tutorial Code First-Migrationen.
Aktualisieren Sie die SeedData
-Klasse so, dass sie einen Wert für die neue Spalte bereitstellt. Eine Beispieländerung ist nachstehend gezeigt. Nehmen Sie diese Änderung jedoch für jeden new Movie
-Block vor.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Sehen Sie sich die fertige SeedData.cs-Datei an.
Erstellen Sie die Projektmappe.
Hinzufügen einer Migration für das Bewertungsfeld
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager > Paket-Manager-Konsole aus.
Geben Sie in der PMC die folgenden Befehle ein:
Add-Migration Rating Update-Database
Der Add-Migration
-Befehl weist das Framework an, Folgendes auszuführen:
- Das Modell
Movie
mit dem Schema der DatenbankMovie
vergleichen. - Erstellen von Code, um das Schema der Datenbank in das neue Modell zu migrieren
Der Name „Rating“ ist beliebig und wird verwendet, um die Migrationsdatei zu benennen. Es ist hilfreich, einen aussagekräftigen Namen für die Migrationsdatei zu verwenden.
Der Update-Database
-Befehl weist das Framework an, die Schemaänderungen auf die Datenbank anzuwenden und vorhandene Daten beizubehalten.
Löschen Sie alle Datensätze aus der Datenbank. Dann führt der Initialisierer ein Seeding für die Datenbank aus und fügt das Feld Rating
hinzu. Dies ist über die Option „Löschen“ im Browser oder über SQL Server-Objekt-Explorer (SSOX) möglich.
Eine weitere Möglichkeit ist, die Datenbank zu löschen und Migrationen zu verwenden, um die Datenbank neu zu erstellen. So löschen Sie die Datenbank in SSOX
Wählen Sie die Datenbank in SSOX aus.
Klicken Sie mit der rechten Maustaste auf die Datenbank, und wählen Sie Löschen aus.
Aktivieren Sie Vorhandene Verbindungen schließen.
Klicken Sie auf OK.
Aktualisieren Sie die Datenbank in PMC:
Update-Database
Führen Sie die App aus, und überprüfen Sie, ob Sie Filme mit dem Feld Rating
erstellen/bearbeiten/anzeigen können. Wenn für die Datenbank kein Seed ausgeführt wird, legen Sie einen Haltepunkt in der SeedData.Initialize
-Methode fest.
Nächste Schritte
Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).
In diesem Abschnitt werden Entity Framework Code First-Migrationen für folgende Zwecke verwendet:
- Dem Modell wird ein neues Feld hinzugefügt.
- Die neue Änderung am Feldschema wird in die Datenbank migriert.
Bei der Verwendung von EF Code First für die automatische Erstellung einer Datenbank geht Code First wie folgt vor:
- Es fügt der Datenbank eine
__EFMigrationsHistory
-Tabelle hinzu, um nachzuverfolgen, ob das Schema der Datenbank mit den Modellklassen synchron ist, aus denen sie generiert wurde. - Wenn die Datenbank mit den Modellklassen nicht synchron ist, löst EF eine Ausnahme aus.
Durch die automatische Überprüfung, ob Schema und Modell synchron sind, können Probleme aufgrund inkonsistenter Datenbankencodes leichter ermittelt werden.
Hinzufügen einer Rating-Eigenschaft zum Movie-Modell
Öffnen Sie die Datei
Models/Movie.cs
, und fügen Sie eineRating
-Eigenschaft hinzu: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; } }
Erstellen Sie die App.
Bearbeiten Sie
Pages/Movies/Index.cshtml
, und fügen Sie ein FeldRating
hinzu:@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>
Aktualisieren Sie die folgenden Seiten mit einem
Rating
-Feld:
Die App funktioniert erst, nachdem die Datenbank so aktualisiert wurde, dass sie das neue Feld enthält. Wenn Sie die App ohne eine Aktualisierung der Datenbank ausführen, wird eine SqlException
ausgelöst:
SqlException: Invalid column name 'Rating'.
Die SqlException
-Ausnahme wird dadurch verursacht, dass sich die aktualisierte Modellklasse „Movie“ vom Schema der Tabelle „Movie“ der Datenbank unterscheidet. Die Datenbanktabelle enthält nicht die Spalte Rating
.
Es gibt mehrere Vorgehensweisen zum Beheben des Fehlers:
Lassen Sie die Datenbank von Entity Framework automatisch löschen und mit dem neuen Modellklassenschema neu erstellen. Dieser Ansatz ist früh im Entwicklungszyklus sehr praktisch. Er ermöglicht Ihnen, das Modell und das Datenbankschema schnell gemeinsam weiterzuentwickeln. Der Nachteil ist, dass in der Datenbank vorhandene Daten verloren gehen. Verwenden Sie diesen Ansatz nicht in einer Produktionsdatenbank! Das Löschen der Datenbank bei Schemaänderungen und das Verwenden eines Initialisierers zum automatischen Ausführen eines Seedings für eine Datenbank mit Testdaten ist häufig eine produktive Möglichkeit zum Entwickeln einer App.
Ändern Sie das Schema der vorhandenen Datenbank explizit so, dass es mit den Modellklassen übereinstimmt. Der Vorteil dieses Ansatzes ist, dass Sie Ihre Daten behalten. Sie können diese Änderung entweder manuell oder durch Erstellen eines Skripts zur Änderung der Datenbank vornehmen.
Verwenden Sie Code First-Migrationen, um das Datenbankschema zu aktualisieren.
Verwenden Sie für dieses Tutorial Code First-Migrationen.
Aktualisieren Sie die SeedData
-Klasse so, dass sie einen Wert für die neue Spalte bereitstellt. Eine Beispieländerung ist nachstehend gezeigt. Nehmen Sie diese Änderung jedoch für jeden new Movie
-Block vor.
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M,
Rating = "R"
},
Sehen Sie sich die fertige SeedData.cs-Datei an.
Erstellen Sie die Projektmappe.
Hinzufügen einer Migration für das Bewertungsfeld
Wählen Sie im Menü Extras die Optionen NuGet-Paket-Manager > Paket-Manager-Konsole aus.
Geben Sie in der PMC die folgenden Befehle ein:
Add-Migration Rating Update-Database
Der Add-Migration
-Befehl weist das Framework an, Folgendes auszuführen:
- Das Modell
Movie
mit dem Schema der DatenbankMovie
vergleichen. - Erstellen von Code, um das Schema der Datenbank in das neue Modell zu migrieren
Der Name „Rating“ ist beliebig und wird verwendet, um die Migrationsdatei zu benennen. Es ist hilfreich, einen aussagekräftigen Namen für die Migrationsdatei zu verwenden.
Der Update-Database
-Befehl weist das Framework an, die Schemaänderungen auf die Datenbank anzuwenden und vorhandene Daten beizubehalten.
Wenn Sie alle Datensätze aus der Datenbank löschen, führt der Initialisierer ein Seeding für die Datenbank aus und fügt das Feld Rating
hinzu. Dies ist über die Links „Löschen“ im Browser oder SQL Server-Objekt-Explorer (SSOX) möglich.
Eine weitere Möglichkeit ist, die Datenbank zu löschen und Migrationen zu verwenden, um die Datenbank neu zu erstellen. So löschen Sie die Datenbank in SSOX
Wählen Sie die Datenbank in SSOX aus.
Klicken Sie mit der rechten Maustaste auf die Datenbank, und wählen Sie Löschen aus.
Aktivieren Sie Vorhandene Verbindungen schließen.
Klicken Sie auf OK.
Aktualisieren Sie die Datenbank in PMC:
Update-Database
Führen Sie die App aus, und überprüfen Sie, ob Sie Filme mit dem Feld Rating
erstellen/bearbeiten/anzeigen können. Wenn für die Datenbank kein Seed ausgeführt wird, legen Sie einen Haltepunkt in der SeedData.Initialize
-Methode fest.