Partager via


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.

Le développeur a tapé la lettre R pour la valeur d’attribut asp-for dans le deuxième élément étiquette de la vue. Un menu contextuel IntelliSense s’est affiché montrant les champs disponibles, notamment Rating, qui est automatiquement mis en surbrillance dans la liste. Quand le développeur clique sur le champ ou appuie sur Entrée, la valeur est définie sur Rating.

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 :

  1. 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.

  2. 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.

  3. 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.

Menu 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.

Le développeur a tapé la lettre R pour la valeur d’attribut asp-for dans le deuxième élément étiquette de la vue. Un menu contextuel IntelliSense s’est affiché montrant les champs disponibles, notamment Rating, qui est automatiquement mis en surbrillance dans la liste. Quand le développeur clique sur le champ ou appuie sur Entrée, la valeur est définie sur Rating.

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 :

  1. 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.

  2. 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.

  3. 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.

Menu 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.

Le développeur a tapé la lettre R pour la valeur d’attribut asp-for dans le deuxième élément étiquette de la vue. Un menu contextuel IntelliSense s’est affiché montrant les champs disponibles, notamment Rating, qui est automatiquement mis en surbrillance dans la liste. Quand le développeur clique sur le champ ou appuie sur Entrée, la valeur est définie sur Rating.

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 :

  1. 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.

  2. 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.

  3. 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.

Menu 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

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.

Le développeur a tapé la lettre R pour la valeur d’attribut asp-for dans le deuxième élément étiquette de la vue. Un menu contextuel IntelliSense s’est affiché montrant les champs disponibles, notamment Rating, qui est automatiquement mis en surbrillance dans la liste. Quand le développeur clique sur le champ ou appuie sur Entrée, la valeur est définie sur Rating.

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 :

  1. 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.

  2. 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.

  3. 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.

Menu 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

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 :

<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.

Le développeur a tapé la lettre R pour la valeur d’attribut asp-for dans le deuxième élément étiquette de la vue. Un menu contextuel IntelliSense s’est affiché montrant les champs disponibles, notamment Rating, qui est automatiquement mis en surbrillance dans la liste. Quand le développeur clique sur le champ ou appuie sur Entrée, la valeur est définie sur Rating.

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 :

  1. 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.

  2. 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.

  3. 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.

Menu 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

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 :

<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.

Le développeur a tapé la lettre R pour la valeur d’attribut asp-for dans le deuxième élément étiquette de la vue. Un menu contextuel IntelliSense s’est affiché montrant les champs disponibles, notamment Rating, qui est automatiquement mis en surbrillance dans la liste. Quand le développeur clique sur le champ ou appuie sur Entrée, la valeur est définie sur Rating.

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 :

  1. 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.

  2. 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.

  3. 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.

Menu 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.