Partie 5, Utilisation d’une base de données dans 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 8 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 8 de cet article.

Par Rick Anderson et Jon P Smith.

L’objet MvcMovieContext gère la tâche de connexion à la base de données et de mappage d’objets Movie à des enregistrements de la base de données. Le contexte de base de données est inscrit auprès du conteneur d’injection de dépendances dans le fichier Program.cs :

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

Le système de configuration d’ASP.NET Core lit la clé ConnectionString. Pour un développement local, il obtient la chaîne de connexion à partir du fichier appsettings.json.

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

Quand l’application est déployée sur un serveur de test ou de production, une variable d’environnement peut être utilisée pour définir la chaîne de connexion à un serveur SQL Server de production. Pour plus d’informations, consultez Configuration.

Base de données locale SQL Server Express

Base de données locale :

  • Version légère du moteur de base de données SQL Server Express, installée par défaut avec Visual Studio.
  • Démarre à la demande à l’aide d’une chaîne de connexion.
  • Est destiné au développement de programmes. Elle s’exécute en mode utilisateur, ce qui n’implique aucune configuration complexe.
  • Par défaut, crée des fichiers .mdf dans le répertoire C:/Users/{utilisateur}.

Examiner la base de données

Dans le menu Affichage, ouvrez l’Explorateur d’objets SQL Server (SSOX).

Cliquez avec le bouton droit sur la table Movie(dbo.Movie) >Concepteur de vues

Cliquez avec le bouton droit sur la table Movie > Concepteur de vues.

Table Movie ouverte dans le Concepteur

Notez l’icône de clé en regard de ID. Par défaut, EF fait d’une propriété nommée ID la clé primaire.

Cliquez avec le bouton droit sur la table Movie> Afficher les données.

Cliquez avec le bouton droit sur la table Movie > Afficher les données.

Table Film ouverte, montrant les données de la table

Amorcer la base de données

Créez une classe nommée SeedData dans l’espace de noms Modèles. Remplacez le code généré par ce qui suit :

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // Look for any movies.
            if (context.Movie.Any())
            {
                return;   // DB has been seeded
            }
            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    Genre = "Romantic Comedy",
                    Price = 7.99M
                },
                new Movie
                {
                    Title = "Ghostbusters ",
                    ReleaseDate = DateTime.Parse("1984-3-13"),
                    Genre = "Comedy",
                    Price = 8.99M
                },
                new Movie
                {
                    Title = "Ghostbusters 2",
                    ReleaseDate = DateTime.Parse("1986-2-23"),
                    Genre = "Comedy",
                    Price = 9.99M
                },
                new Movie
                {
                    Title = "Rio Bravo",
                    ReleaseDate = DateTime.Parse("1959-4-15"),
                    Genre = "Western",
                    Price = 3.99M
                }
            );
            context.SaveChanges();
        }
    }
}

Si la base de données contient des films, l’initialiseur de valeur initiale retourne une valeur et aucun film n’est ajouté.

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

Ajouter l’initialiseur de valeur initiale

Remplacez le contenu de Program.cs par le code suivant. Le nouveau code est mis en évidence.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Supprimez tous les enregistrements de la base de données. Pour ce faire, utilisez les liens de suppression disponibles dans le navigateur ou à partir de SSOX.

Testez l’application. Forcez l’application à s’initialiser en appelant les méthodes de la classe Program.cs, pour que la méthode seed s’exécute. Pour forcer l’initialisation, fermez la fenêtre d’invite de commandes que Visual Studio a ouverte, puis redémarrez en appuyant sur Ctrl+F5.

L’application affiche les données de valeurs de départ.

Application MVC Movie ouverte dans Microsoft Edge, affichant les données relatives aux films

L’objet MvcMovieContext gère la tâche de connexion à la base de données et de mappage d’objets Movie à des enregistrements de la base de données. Le contexte de base de données est inscrit auprès du conteneur d’injection de dépendances dans le fichier Program.cs :

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

Le système de configuration d’ASP.NET Core lit la clé ConnectionString. Pour un développement local, il obtient la chaîne de connexion à partir du fichier appsettings.json.

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

Quand l’application est déployée sur un serveur de test ou de production, une variable d’environnement peut être utilisée pour définir la chaîne de connexion à un serveur SQL Server de production. Pour plus d’informations, consultez Configuration.

Base de données locale SQL Server Express

Base de données locale :

  • Version légère du moteur de base de données SQL Server Express, installée par défaut avec Visual Studio.
  • Démarre à la demande à l’aide d’une chaîne de connexion.
  • Est destiné au développement de programmes. Elle s’exécute en mode utilisateur, ce qui n’implique aucune configuration complexe.
  • Par défaut, crée des fichiers .mdf dans le répertoire C:/Users/{utilisateur}.

Examiner la base de données

Dans le menu Affichage, ouvrez l’Explorateur d’objets SQL Server (SSOX).

Cliquez avec le bouton droit sur la table Movie(dbo.Movie) >Concepteur de vues

Cliquez avec le bouton droit sur la table Movie > Concepteur de vues.

Table Movie ouverte dans le Concepteur

Notez l’icône de clé en regard de ID. Par défaut, EF fait d’une propriété nommée ID la clé primaire.

Cliquez avec le bouton droit sur la table Movie> Afficher les données.

Cliquez avec le bouton droit sur la table Movie > Afficher les données.

Table Film ouverte, montrant les données de la table

Amorcer la base de données

Créez une classe nommée SeedData dans l’espace de noms Modèles. Remplacez le code généré par ce qui suit :

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // Look for any movies.
            if (context.Movie.Any())
            {
                return;   // DB has been seeded
            }
            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    Genre = "Romantic Comedy",
                    Price = 7.99M
                },
                new Movie
                {
                    Title = "Ghostbusters ",
                    ReleaseDate = DateTime.Parse("1984-3-13"),
                    Genre = "Comedy",
                    Price = 8.99M
                },
                new Movie
                {
                    Title = "Ghostbusters 2",
                    ReleaseDate = DateTime.Parse("1986-2-23"),
                    Genre = "Comedy",
                    Price = 9.99M
                },
                new Movie
                {
                    Title = "Rio Bravo",
                    ReleaseDate = DateTime.Parse("1959-4-15"),
                    Genre = "Western",
                    Price = 3.99M
                }
            );
            context.SaveChanges();
        }
    }
}

Si la base de données contient des films, l’initialiseur de valeur initiale retourne une valeur et aucun film n’est ajouté.

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

<a name=snippet_"si">

Ajouter l’initialiseur de valeur initiale

Remplacez le contenu de Program.cs par le code suivant. Le nouveau code est mis en évidence.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Supprimez tous les enregistrements de la base de données. Pour ce faire, utilisez les liens de suppression disponibles dans le navigateur ou à partir de SSOX.

Testez l’application. Forcez l’application à s’initialiser en appelant les méthodes de la classe Program.cs, pour que la méthode seed s’exécute. Pour forcer l’initialisation, fermez la fenêtre d’invite de commandes que Visual Studio a ouverte, puis redémarrez en appuyant sur Ctrl+F5.

L’application affiche les données de valeurs de départ.

Application MVC Movie ouverte dans Microsoft Edge, affichant les données relatives aux films

L’objet MvcMovieContext gère la tâche de connexion à la base de données et de mappage d’objets Movie à des enregistrements de la base de données. Le contexte de base de données est inscrit auprès du conteneur d’injection de dépendances dans le fichier Program.cs :

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

Le système de configuration d’ASP.NET Core lit la clé ConnectionString. Pour un développement local, il obtient la chaîne de connexion à partir du fichier appsettings.json.

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Quand l’application est déployée sur un serveur de test ou de production, une variable d’environnement peut être utilisée pour définir la chaîne de connexion à un serveur SQL Server de production. Pour plus d’informations, consultez Configuration.

Base de données locale SQL Server Express

Base de données locale :

  • Version légère du moteur de base de données SQL Server Express, installée par défaut avec Visual Studio.
  • Démarre à la demande à l’aide d’une chaîne de connexion.
  • Est destiné au développement de programmes. Elle s’exécute en mode utilisateur, ce qui n’implique aucune configuration complexe.
  • Par défaut, crée des fichiers .mdf dans le répertoire C:/Users/{utilisateur}.

Amorcer la base de données

Créez une classe nommée SeedData dans l’espace de noms Modèles. Remplacez le code généré par ce qui suit :

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

Si la base de données contient des films, l’initialiseur de valeur initiale retourne une valeur et aucun film n’est ajouté.

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

Ajouter l’initialiseur de valeur initiale

Remplacez le contenu de Program.cs par le code suivant. Le nouveau code est mis en évidence.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Supprimez tous les enregistrements de la base de données. Pour ce faire, utilisez les liens de suppression disponibles dans le navigateur ou à partir de SSOX.

Testez l’application. Forcez l’application à s’initialiser en appelant les méthodes de la classe Program.cs, pour que la méthode seed s’exécute. Pour forcer l’initialisation, fermez la fenêtre d’invite de commandes que Visual Studio a ouverte, puis redémarrez en appuyant sur Ctrl+F5.

L’application affiche les données de valeurs de départ.

Application MVC Movie ouverte dans Microsoft Edge, affichant les données relatives aux films

L’objet MvcMovieContext gère la tâche de connexion à la base de données et de mappage d’objets Movie à des enregistrements de la base de données. Le contexte de base de données est inscrit auprès du conteneur Injection de dépendances dans la méthode ConfigureServices du fichier Startup.cs :

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}

Le système de configuration d’ASP.NET Core lit la clé ConnectionString. Pour un développement local, il obtient la chaîne de connexion à partir du fichier appsettings.json.

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Quand l’application est déployée sur un serveur de test ou de production, une variable d’environnement peut être utilisée pour définir la chaîne de connexion à un serveur SQL Server de production. Pour plus d’informations, consultez Configuration.

Base de données locale SQL Server Express

Base de données locale :

  • Version légère du moteur de base de données SQL Server Express, installée par défaut avec Visual Studio.
  • Démarre à la demande à l’aide d’une chaîne de connexion.
  • Est destiné au développement de programmes. Elle s’exécute en mode utilisateur, ce qui n’implique aucune configuration complexe.
  • Par défaut, crée des fichiers .mdf dans le répertoire C:/Users/{utilisateur}.

Examiner la base de données

Dans le menu Affichage, ouvrez l’Explorateur d’objets SQL Server (SSOX).

Menu Affichage

Cliquez avec le bouton droit sur la table Movie> Concepteur de vue.

Cliquez avec le bouton droit sur la table Movie > Concepteur de vues.

Table Movie ouverte dans le Concepteur

Notez l’icône de clé en regard de ID. Par défaut, EF fait d’une propriété nommée ID la clé primaire.

Cliquez avec le bouton droit sur la table Movie> Afficher les données.

Cliquez avec le bouton droit sur la table Movie > Afficher les données.

Table Film ouverte, montrant les données de la table

Amorcer la base de données

Créez une classe nommée SeedData dans l’espace de noms Modèles. Remplacez le code généré par ce qui suit :

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

Si la base de données contient des films, l’initialiseur de valeur initiale retourne une valeur et aucun film n’est ajouté.

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

Ajouter l’initialiseur de valeur initiale

Remplacez le contenu de Program.cs par le code suivant :

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MvcMovie.Data;
using MvcMovie.Models;
using System;

namespace MvcMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    SeedData.Initialize(services);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB.");
                }
            }

            host.Run();

        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

Testez l’application.

Supprimez tous les enregistrements de la base de données. Pour ce faire, utilisez les liens de suppression disponibles dans le navigateur ou à partir de SSOX.

Forcez l’application à s’initialiser en appelant les méthodes de la classe Startup, pour que la méthode seed s’exécute. Pour forcer l’initialisation, IIS Express doit être arrêté et redémarré. Pour cela, adoptez l’une des approches suivantes :

  • Cliquez avec le bouton droit sur l’icône de barre d’état système IIS Express dans la zone de notification, puis appuyez sur Quitter ou sur Arrêter le site :

    Icône de la barre d’état système IIS Express

    Menu contextuel

    • Si vous exécutiez Visual Studio en mode non-débogage, appuyez sur F5 pour l’exécuter en mode débogage.
    • Si vous exécutiez Visual Studio en mode débogage, arrêtez le débogueur et appuyez sur F5.

L’application affiche les données de valeurs de départ.

Application MVC Movie ouverte dans Microsoft Edge, affichant les données relatives aux films