Partie 8, ajouter un nouveau champ à une application ASP.NET Core MVC
Remarque
Ceci n’est pas la dernière version de cet article. Pour la version actuelle, consultez la version .NET 9 de cet article.
Avertissement
Cette version d’ASP.NET Core n’est plus prise en charge. Pour plus d’informations, consultez la stratégie de support .NET et .NET Core. Pour la version actuelle, consultez la version .NET 9 de cet article.
Important
Ces informations portent sur la préversion du produit, qui est susceptible d’être en grande partie modifié avant sa commercialisation. Microsoft n’offre aucune garantie, expresse ou implicite, concernant les informations fournies ici.
Pour la version actuelle, consultez la version .NET 9 de cet article.
Par Rick Anderson
Dans cette section, les migrations Entity Framework sont utilisées pour :
- Ajouter un nouveau champ au modèle.
- Migrer le nouveau champ vers la base de données.
Quand Entity Framework (EF) est utilisé pour la création automatique d’une base de données à partir de classes de modèle :
- Une table est ajoutée à la base de données pour en suivre le schéma.
- On vérifie que la base de données est synchronisée avec les classes de modèle à partir desquelles elle a été générée. S’ils ne sont pas synchronisés, EF lève une exception. Cela facilite la recherche de problèmes d’incohérence de code/de bases de données.
Ajouter une propriété Rating au modèle Movie
Ajoutez une propriété Rating
à Models/Movie.cs
:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
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; }
}
Générer l’application
Appuyez sur Ctrl+Maj+B
Comme vous avez ajouté un nouveau champ à la classe Movie
, vous devez mettre à jour la liste des liaisons de propriété pour y inclure cette nouvelle propriété. Dans MoviesController.cs
, mettez à jour l’attribut [Bind]
des méthodes d’action Create
et Edit
pour y inclure la propriété Rating
:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Mettez à jour les modèles de vue pour afficher, créer et modifier la nouvelle propriété Rating
dans la vue du navigateur.
Modifiez le fichier /Views/Movies/Index.cshtml
et ajoutez un champ Rating
:
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies!)
{
<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-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Mettez à jour /Views/Movies/Create.cshtml
avec un champ Rating
.
Vous pouvez copier/coller le « groupe de formulaire » précédent et laisser IntelliSense vous aider à mettre à jour les champs. IntelliSense fonctionne avec des Tag Helpers.
Ajoutez la propriété Rating
aux modèles d’affichage Create.cshtml
, Delete.cshtml
, Details.cshtml
et Edit.cshtml
restants.
Mettez à jour la classe SeedData
pour qu’elle fournisse une valeur pour la nouvelle colonne. Vous pouvez voir un exemple de modification ci-dessous, mais elle doit être appliquée à chaque new Movie
.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
L’application ne fonctionne pas tant que la base de données n’est pas mise à jour pour inclure le nouveau champ. Si elle est exécutée maintenant, l’erreur SqlException
est levée :
SqlException: Invalid column name 'Rating'.
Cette erreur survient car la classe du modèle Movie mise à jour est différente du schéma de la table Movie de la base de données existante. (Il n’existe pas de colonne Rating
dans la table de base de données.)
Plusieurs approches sont possibles pour résoudre l’erreur :
Laissez Entity Framework supprimer et recréer automatiquement la base de données sur la base du nouveau schéma de classe de modèle. Cette approche est très utile au début du cycle de développement quand vous effectuez un développement actif sur une base de données de test. Elle permet de faire évoluer rapidement le schéma de modèle et de base de données ensemble. L’inconvénient, cependant, est que vous perdez les données existantes dans la base de données. Par conséquent, n’utilisez pas cette approche sur une base de données de production. L’utilisation d’un initialiseur pour amorcer automatiquement une base de données avec des données de test est souvent un moyen efficace pour développer une application. Il s’agit d’une bonne approche pour le développement initial et lors de l’utilisation de SQLite.
Modifier explicitement le schéma de la base de données existante pour le faire correspondre aux classes du modèle. L’avantage de cette approche est que vous conservez vos données. Vous pouvez apporter cette modification manuellement ou en créant un script de modification de la base de données.
Utilisez les migrations Entity Framework pour mettre à jour le schéma de base de données.
Ce tutoriel utilise les migrations Entity Framework.
Dans le menu Outils, sélectionnez Gestionnaire de package NuGet > Console du gestionnaire de package.
Dans la Console du gestionnaire de package, entrez la commande suivante :
Add-Migration Rating
La commande Add-Migration
indique au framework de migration d’examiner le modèle Movie
actuel avec le schéma de la base de données Movie
actuel et de créer le code nécessaire pour migrer la base de données vers le nouveau modèle.
Le nom « Rating » est arbitraire et utilisé pour nommer le fichier de migration. Il est utile d’utiliser un nom explicite pour le fichier de migration.
Si tous les enregistrements de la base de données sont supprimés, la méthode d’initialisation amorce la base de données et inclut le champ Rating
.
Dans la Console du gestionnaire de package, entrez la commande suivante :
Update-Database
La commande Update-Database exécute la méthode Up dans les migrations qui n’ont pas été appliquées.
Exécutez l’application et vérifiez que vous pouvez créer, modifier et afficher des films avec un champ Rating
.
Dans cette section, Migrations Entity Framework Code First est utilisé pour :
- Ajouter un nouveau champ au modèle.
- Migrer le nouveau champ vers la base de données.
Quand EF Code First est utilisé pour créer automatiquement une base de données, Code First :
- Ajoute une table à la base de données pour en suivre le schéma.
- Vérifie que la base de données est synchronisée avec les classes de modèle à partir desquelles elle a été générée. S’ils ne sont pas synchronisés, EF lève une exception. Cela facilite la recherche de problèmes d’incohérence de code/de bases de données.
Ajouter une propriété Rating au modèle Movie
Ajoutez une propriété Rating
à Models/Movie.cs
:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
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; }
}
Générer l’application
Appuyez sur Ctrl+Maj+B
Comme vous avez ajouté un nouveau champ à la classe Movie
, vous devez mettre à jour la liste des liaisons de propriété pour y inclure cette nouvelle propriété. Dans MoviesController.cs
, mettez à jour l’attribut [Bind]
des méthodes d’action Create
et Edit
pour y inclure la propriété Rating
:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Mettez à jour les modèles de vue pour afficher, créer et modifier la nouvelle propriété Rating
dans la vue du navigateur.
Modifiez le fichier /Views/Movies/Index.cshtml
et ajoutez un champ Rating
:
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies!)
{
<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-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Mettez à jour /Views/Movies/Create.cshtml
avec un champ Rating
.
Vous pouvez copier/coller le « groupe de formulaire » précédent et laisser IntelliSense vous aider à mettre à jour les champs. IntelliSense fonctionne avec des Tag Helpers.
Mettez à jour les modèles restants.
Mettez à jour la classe SeedData
pour qu’elle fournisse une valeur pour la nouvelle colonne. Vous pouvez voir un exemple de modification ci-dessous, mais elle doit être appliquée à chaque new Movie
.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
L’application ne fonctionne pas tant que la base de données n’est pas mise à jour pour inclure le nouveau champ. Si elle est exécutée maintenant, l’erreur SqlException
est levée :
SqlException: Invalid column name 'Rating'.
Cette erreur survient car la classe du modèle Movie mise à jour est différente du schéma de la table Movie de la base de données existante. (Il n’existe pas de colonne Rating
dans la table de base de données.)
Plusieurs approches sont possibles pour résoudre l’erreur :
Laissez Entity Framework supprimer et recréer automatiquement la base de données sur la base du nouveau schéma de classe de modèle. Cette approche est très utile au début du cycle de développement quand vous effectuez un développement actif sur une base de données de test. Elle permet de faire évoluer rapidement le schéma de modèle et de base de données ensemble. L’inconvénient, cependant, est que vous perdez les données existantes dans la base de données. Par conséquent, n’utilisez pas cette approche sur une base de données de production. L’utilisation d’un initialiseur pour amorcer automatiquement une base de données avec des données de test est souvent un moyen efficace pour développer une application. Il s’agit d’une bonne approche pour le développement initial et lors de l’utilisation de SQLite.
Modifier explicitement le schéma de la base de données existante pour le faire correspondre aux classes du modèle. L’avantage de cette approche est que vous conservez vos données. Vous pouvez apporter cette modification manuellement ou en créant un script de modification de la base de données.
Utilisez les migrations Code First pour mettre à jour le schéma de base de données.
Pour ce didacticiel, les migrations Code First sont utilisées.
Dans le menu Outils, sélectionnez Gestionnaire de package NuGet > Console du gestionnaire de package.
Dans la console du gestionnaire de package, entrez les commandes suivantes :
Add-Migration Rating
Update-Database
La commande Add-Migration
indique au framework de migration d’examiner le modèle Movie
actuel avec le schéma de la base de données Movie
actuel et de créer le code nécessaire pour migrer la base de données vers le nouveau modèle.
Le nom « Rating » est arbitraire et utilisé pour nommer le fichier de migration. Il est utile d’utiliser un nom explicite pour le fichier de migration.
Si tous les enregistrements de la base de données sont supprimés, la méthode d’initialisation amorce la base de données et inclut le champ Rating
.
Exécutez l’application et vérifiez que vous pouvez créer, modifier et afficher des films avec un champ Rating
.
Dans cette section, Migrations Entity Framework Code First est utilisé pour :
- Ajouter un nouveau champ au modèle.
- Migrer le nouveau champ vers la base de données.
Quand EF Code First est utilisé pour créer automatiquement une base de données, Code First :
- Ajoute une table à la base de données pour en suivre le schéma.
- Vérifie que la base de données est synchronisée avec les classes de modèle à partir desquelles elle a été générée. S’ils ne sont pas synchronisés, EF lève une exception. Cela facilite la recherche de problèmes d’incohérence de code/de bases de données.
Ajouter une propriété Rating au modèle Movie
Ajoutez une propriété Rating
à Models/Movie.cs
:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
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; }
}
Générer l’application
Appuyez sur Ctrl+Maj+B
Comme vous avez ajouté un nouveau champ à la classe Movie
, vous devez mettre à jour la liste des liaisons de propriété pour y inclure cette nouvelle propriété. Dans MoviesController.cs
, mettez à jour l’attribut [Bind]
des méthodes d’action Create
et Edit
pour y inclure la propriété Rating
:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Mettez à jour les modèles de vue pour afficher, créer et modifier la nouvelle propriété Rating
dans la vue du navigateur.
Modifiez le fichier /Views/Movies/Index.cshtml
et ajoutez un champ Rating
:
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies![0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies!)
{
<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-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Mettez à jour /Views/Movies/Create.cshtml
avec un champ Rating
.
Vous pouvez copier/coller le « groupe de formulaire » précédent et laisser IntelliSense vous aider à mettre à jour les champs. IntelliSense fonctionne avec des Tag Helpers.
Mettez à jour les modèles restants.
Mettez à jour la classe SeedData
pour qu’elle fournisse une valeur pour la nouvelle colonne. Vous pouvez voir un exemple de modification ci-dessous, mais elle doit être appliquée à chaque new Movie
.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
L’application ne fonctionne pas tant que la base de données n’est pas mise à jour pour inclure le nouveau champ. Si elle est exécutée maintenant, l’erreur SqlException
est levée :
SqlException: Invalid column name 'Rating'.
Cette erreur survient car la classe du modèle Movie mise à jour est différente du schéma de la table Movie de la base de données existante. (Il n’existe pas de colonne Rating
dans la table de base de données.)
Plusieurs approches sont possibles pour résoudre l’erreur :
Laissez Entity Framework supprimer et recréer automatiquement la base de données sur la base du nouveau schéma de classe de modèle. Cette approche est très utile au début du cycle de développement quand vous effectuez un développement actif sur une base de données de test. Elle permet de faire évoluer rapidement le schéma de modèle et de base de données ensemble. L’inconvénient, cependant, est que vous perdez les données existantes dans la base de données. Par conséquent, n’utilisez pas cette approche sur une base de données de production. L’utilisation d’un initialiseur pour amorcer automatiquement une base de données avec des données de test est souvent un moyen efficace pour développer une application. Il s’agit d’une bonne approche pour le développement initial et lors de l’utilisation de SQLite.
Modifier explicitement le schéma de la base de données existante pour le faire correspondre aux classes du modèle. L’avantage de cette approche est que vous conservez vos données. Vous pouvez apporter cette modification manuellement ou en créant un script de modification de la base de données.
Utilisez les migrations Code First pour mettre à jour le schéma de base de données.
Pour ce didacticiel, les migrations Code First sont utilisées.
Dans le menu Outils, sélectionnez Gestionnaire de package NuGet > Console du gestionnaire de package.
Dans la console du gestionnaire de package, entrez les commandes suivantes :
Add-Migration Rating
Update-Database
La commande Add-Migration
indique au framework de migration d’examiner le modèle Movie
actuel avec le schéma de la base de données Movie
actuel et de créer le code nécessaire pour migrer la base de données vers le nouveau modèle.
Le nom « Rating » est arbitraire et utilisé pour nommer le fichier de migration. Il est utile d’utiliser un nom explicite pour le fichier de migration.
Si tous les enregistrements de la base de données sont supprimés, la méthode d’initialisation amorce la base de données et inclut le champ Rating
.
Exécutez l’application et vérifiez que vous pouvez créer, modifier et afficher des films avec un champ Rating
.
Dans cette section, Migrations Entity Framework Code First est utilisé pour :
- Ajouter un nouveau champ au modèle.
- Migrer le nouveau champ vers la base de données.
Quand EF Code First est utilisé pour créer automatiquement une base de données, Code First :
- Ajoute une table à la base de données pour en suivre le schéma.
- Vérifie que la base de données est synchronisée avec les classes de modèle à partir desquelles elle a été générée. S’ils ne sont pas synchronisés, EF lève une exception. Cela facilite la recherche de problèmes d’incohérence de code/de bases de données.
Ajouter une propriété Rating au modèle Movie
Ajoutez une propriété Rating
à Models/Movie.cs
:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models
{
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; }
}
}
Générer l’application
Comme vous avez ajouté un nouveau champ à la classe Movie
, vous devez mettre à jour la liste des liaisons de propriété pour y inclure cette nouvelle propriété. Dans MoviesController.cs
, mettez à jour l’attribut [Bind]
des méthodes d’action Create
et Edit
pour y inclure la propriété Rating
:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Mettez à jour les modèles de vue pour afficher, créer et modifier la nouvelle propriété Rating
dans la vue du navigateur.
Modifiez le fichier /Views/Movies/Index.cshtml
et ajoutez un champ Rating
:
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies)
{
<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-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Mettez à jour /Views/Movies/Create.cshtml
avec un champ Rating
.
Vous pouvez copier/coller le « groupe de formulaire » précédent et laisser IntelliSense vous aider à mettre à jour les champs. IntelliSense fonctionne avec des Tag Helpers.
Mettez à jour les modèles restants.
Mettez à jour la classe SeedData
pour qu’elle fournisse une valeur pour la nouvelle colonne. Vous pouvez voir un exemple de modification ci-dessous, mais elle doit être appliquée à chaque new Movie
.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
L’application ne fonctionne pas tant que la base de données n’est pas mise à jour pour inclure le nouveau champ. Si elle est exécutée maintenant, l’erreur SqlException
est levée :
SqlException: Invalid column name 'Rating'.
Cette erreur survient car la classe du modèle Movie mise à jour est différente du schéma de la table Movie de la base de données existante. (Il n’existe pas de colonne Rating
dans la table de base de données.)
Plusieurs approches sont possibles pour résoudre l’erreur :
Laissez Entity Framework supprimer et recréer automatiquement la base de données sur la base du nouveau schéma de classe de modèle. Cette approche est très utile au début du cycle de développement quand vous effectuez un développement actif sur une base de données de test. Elle permet de faire évoluer rapidement le schéma de modèle et de base de données ensemble. L’inconvénient, cependant, est que vous perdez les données existantes dans la base de données. Par conséquent, n’utilisez pas cette approche sur une base de données de production. L’utilisation d’un initialiseur pour amorcer automatiquement une base de données avec des données de test est souvent un moyen efficace pour développer une application. Il s’agit d’une bonne approche pour le développement initial et lors de l’utilisation de SQLite.
Modifier explicitement le schéma de la base de données existante pour le faire correspondre aux classes du modèle. L’avantage de cette approche est que vous conservez vos données. Vous pouvez apporter cette modification manuellement ou en créant un script de modification de la base de données.
Utilisez les migrations Code First pour mettre à jour le schéma de base de données.
Pour ce didacticiel, les migrations Code First sont utilisées.
Dans le menu Outils, sélectionnez Gestionnaire de package NuGet > Console du gestionnaire de package.
Dans la console du gestionnaire de package, entrez les commandes suivantes :
Add-Migration Rating
Update-Database
La commande Add-Migration
indique au framework de migration d’examiner le modèle Movie
actuel avec le schéma de la base de données Movie
actuel et de créer le code nécessaire pour migrer la base de données vers le nouveau modèle.
Le nom « Rating » est arbitraire et utilisé pour nommer le fichier de migration. Il est utile d’utiliser un nom explicite pour le fichier de migration.
Si tous les enregistrements de la base de données sont supprimés, la méthode d’initialisation amorce la base de données et inclut le champ Rating
.
Exécutez l’application et vérifiez que vous pouvez créer, modifier et afficher des films avec un champ Rating
.
Dans cette section, Migrations Entity Framework Code First est utilisé pour :
- Ajouter un nouveau champ au modèle.
- Migrer le nouveau champ vers la base de données.
Quand EF Code First est utilisé pour créer automatiquement une base de données, Code First :
- Ajoute une table à la base de données pour en suivre le schéma.
- Vérifie que la base de données est synchronisée avec les classes de modèle à partir desquelles elle a été générée. S’ils ne sont pas synchronisés, EF lève une exception. Cela facilite la recherche de problèmes d’incohérence de code/de bases de données.
Ajouter une propriété Rating au modèle Movie
Ajoutez une propriété Rating
à Models/Movie.cs
:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models
{
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; }
}
}
Générer l’application
Comme vous avez ajouté un nouveau champ à la classe Movie
, vous devez mettre à jour la liste des liaisons de propriété pour y inclure cette nouvelle propriété. Dans MoviesController.cs
, mettez à jour l’attribut [Bind]
des méthodes d’action Create
et Edit
pour y inclure la propriété Rating
:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Mettez à jour les modèles de vue pour afficher, créer et modifier la nouvelle propriété Rating
dans la vue du navigateur.
Modifiez le fichier /Views/Movies/Index.cshtml
et ajoutez un champ Rating
:
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies)
{
<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>
Mettez à jour /Views/Movies/Create.cshtml
avec un champ Rating
.
Vous pouvez copier/coller le « groupe de formulaire » précédent et laisser IntelliSense vous aider à mettre à jour les champs. IntelliSense fonctionne avec des Tag Helpers.
Mettez à jour les modèles restants.
Mettez à jour la classe SeedData
pour qu’elle fournisse une valeur pour la nouvelle colonne. Vous pouvez voir un exemple de modification ci-dessous, mais elle doit être appliquée à chaque new Movie
.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
L’application ne fonctionne pas tant que la base de données n’est pas mise à jour pour inclure le nouveau champ. Si elle est exécutée maintenant, l’erreur SqlException
est levée :
SqlException: Invalid column name 'Rating'.
Cette erreur survient car la classe du modèle Movie mise à jour est différente du schéma de la table Movie de la base de données existante. (Il n’existe pas de colonne Rating
dans la table de base de données.)
Plusieurs approches sont possibles pour résoudre l’erreur :
Laissez Entity Framework supprimer et recréer automatiquement la base de données sur la base du nouveau schéma de classe de modèle. Cette approche est très utile au début du cycle de développement quand vous effectuez un développement actif sur une base de données de test. Elle permet de faire évoluer rapidement le schéma de modèle et de base de données ensemble. L’inconvénient, cependant, est que vous perdez les données existantes dans la base de données. Par conséquent, n’utilisez pas cette approche sur une base de données de production. L’utilisation d’un initialiseur pour amorcer automatiquement une base de données avec des données de test est souvent un moyen efficace pour développer une application. Il s’agit d’une bonne approche pour le développement initial et lors de l’utilisation de SQLite.
Modifier explicitement le schéma de la base de données existante pour le faire correspondre aux classes du modèle. L’avantage de cette approche est que vous conservez vos données. Vous pouvez apporter cette modification manuellement ou en créant un script de modification de la base de données.
Utilisez les migrations Code First pour mettre à jour le schéma de base de données.
Pour ce didacticiel, les migrations Code First sont utilisées.
Dans le menu Outils, sélectionnez Gestionnaire de package NuGet > Console du gestionnaire de package.
Dans la console du gestionnaire de package, entrez les commandes suivantes :
Add-Migration Rating
Update-Database
La commande Add-Migration
indique au framework de migration d’examiner le modèle Movie
actuel avec le schéma de la base de données Movie
actuel et de créer le code nécessaire pour migrer la base de données vers le nouveau modèle.
Le nom « Rating » est arbitraire et utilisé pour nommer le fichier de migration. Il est utile d’utiliser un nom explicite pour le fichier de migration.
Si tous les enregistrements de la base de données sont supprimés, la méthode d’initialisation amorce la base de données et inclut le champ Rating
.
Exécutez l’application et vérifiez que vous pouvez créer, modifier et afficher des films avec un champ Rating
.
Dans cette section, Migrations Entity Framework Code First est utilisé pour :
- Ajouter un nouveau champ au modèle.
- Migrer le nouveau champ vers la base de données.
Quand EF Code First est utilisé pour créer automatiquement une base de données, Code First :
- Ajoute une table à la base de données pour en suivre le schéma.
- Vérifie que la base de données est synchronisée avec les classes de modèle à partir desquelles elle a été générée. S’ils ne sont pas synchronisés, EF lève une exception. Cela facilite la recherche de problèmes d’incohérence de code/de bases de données.
Ajouter une propriété Rating au modèle Movie
Ajoutez une propriété Rating
à Models/Movie.cs
:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models
{
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; }
}
}
Générer l’application
Comme vous avez ajouté un nouveau champ à la classe Movie
, vous devez mettre à jour la liste des liaisons de propriété pour y inclure cette nouvelle propriété. Dans MoviesController.cs
, mettez à jour l’attribut [Bind]
des méthodes d’action Create
et Edit
pour y inclure la propriété Rating
:
[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
Mettez à jour les modèles de vue pour afficher, créer et modifier la nouvelle propriété Rating
dans la vue du navigateur.
Modifiez le fichier /Views/Movies/Index.cshtml
et ajoutez un champ Rating
:
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Movies[0].Rating)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Movies)
{
<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>
Mettez à jour /Views/Movies/Create.cshtml
avec un champ Rating
.
Vous pouvez copier/coller le « groupe de formulaire » précédent et laisser IntelliSense vous aider à mettre à jour les champs. IntelliSense fonctionne avec des Tag Helpers.
Mettez à jour les modèles restants.
Mettez à jour la classe SeedData
pour qu’elle fournisse une valeur pour la nouvelle colonne. Vous pouvez voir un exemple de modification ci-dessous, mais elle doit être appliquée à chaque new Movie
.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R",
Price = 7.99M
},
L’application ne fonctionne pas tant que la base de données n’est pas mise à jour pour inclure le nouveau champ. Si elle est exécutée maintenant, l’erreur SqlException
est levée :
SqlException: Invalid column name 'Rating'.
Cette erreur survient car la classe du modèle Movie mise à jour est différente du schéma de la table Movie de la base de données existante. (Il n’existe pas de colonne Rating
dans la table de base de données.)
Plusieurs approches sont possibles pour résoudre l’erreur :
Laissez Entity Framework supprimer et recréer automatiquement la base de données sur la base du nouveau schéma de classe de modèle. Cette approche est très utile au début du cycle de développement quand vous effectuez un développement actif sur une base de données de test. Elle permet de faire évoluer rapidement le schéma de modèle et de base de données ensemble. L’inconvénient, cependant, est que vous perdez les données existantes dans la base de données. Par conséquent, n’utilisez pas cette approche sur une base de données de production. L’utilisation d’un initialiseur pour amorcer automatiquement une base de données avec des données de test est souvent un moyen efficace pour développer une application. Il s’agit d’une bonne approche pour le développement initial et lors de l’utilisation de SQLite.
Modifier explicitement le schéma de la base de données existante pour le faire correspondre aux classes du modèle. L’avantage de cette approche est que vous conservez vos données. Vous pouvez apporter cette modification manuellement ou en créant un script de modification de la base de données.
Utilisez les migrations Code First pour mettre à jour le schéma de base de données.
Pour ce didacticiel, les migrations Code First sont utilisées.
Dans le menu Outils, sélectionnez Gestionnaire de package NuGet > Console du gestionnaire de package.
Dans la console du gestionnaire de package, entrez les commandes suivantes :
Add-Migration Rating
Update-Database
La commande Add-Migration
indique au framework de migration d’examiner le modèle Movie
actuel avec le schéma de la base de données Movie
actuel et de créer le code nécessaire pour migrer la base de données vers le nouveau modèle.
Le nom « Rating » est arbitraire et utilisé pour nommer le fichier de migration. Il est utile d’utiliser un nom explicite pour le fichier de migration.
Si tous les enregistrements de la base de données sont supprimés, la méthode d’initialisation amorce la base de données et inclut le champ Rating
.
Exécutez l’application et vérifiez que vous pouvez créer, modifier et afficher des films avec un champ Rating
.