Partie 5, utiliser une base de données dans une application MVC ASP.NET Core

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 Program.cs fichier :

var builder = WebApplication.CreateBuilder(args);

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

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

"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

LocalDB :

  • Version allégée 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 ciblé pour le développement de programmes. Il s’exécute en mode utilisateur, il n’y a donc aucune configuration complexe.
  • Par défaut, crée des fichiers .mdf dans le répertoire C:/Users/{user} .

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();
        }
    }
}

S’il existe des films dans la base de données, l’initialiseur de départ retourne 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 surbrillance.

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.

Tester l'application. Forcez l’application à initialiser, en appelant le code dans le Program.cs fichier, de sorte que la méthode initiale s’exécute. Pour forcer l’initialisation, fermez la fenêtre d’invite de commandes ouverte par Visual Studio, puis redémarrez en appuyant sur Ctrl+F5.

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

Application Film MVC ouverte dans Microsoft Edge affichant des données de film

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 Program.cs fichier :

var builder = WebApplication.CreateBuilder(args);

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

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

"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

LocalDB :

  • Version allégée 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 ciblé pour le développement de programmes. Il s’exécute en mode utilisateur, il n’y a donc aucune configuration complexe.
  • Par défaut, crée des fichiers .mdf dans le répertoire C:/Users/{user} .

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();
            }
        }
    }
}

S’il existe des films dans la base de données, l’initialiseur de départ retourne 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 surbrillance.

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.

Tester l'application. Forcez l’application à initialiser, en appelant le code dans le Program.cs fichier, de sorte que la méthode initiale s’exécute. Pour forcer l’initialisation, fermez la fenêtre d’invite de commandes ouverte par Visual Studio, puis redémarrez en appuyant sur Ctrl+F5.

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

Application Film MVC ouverte dans Microsoft Edge affichant des données de film

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 la ConfigureServices méthode du Startup.cs fichier :

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

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

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

"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

LocalDB :

  • Version allégée 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 ciblé pour le développement de programmes. Il s’exécute en mode utilisateur, il n’y a donc aucune configuration complexe.
  • Par défaut, crée des fichiers .mdf dans le répertoire C:/Users/{user} .

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 le Concepteur de vues de table>Movie

Cliquez avec le bouton droit sur le Concepteur d’affichages de la table > vidéo

Table Movie ouverte dans le Concepteur

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

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

Cliquez avec le bouton droit sur les données d’affichage de la table > Vidéo

Table vidéo ouverte affichant des données de 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();
            }
        }
    }
}

S’il existe des films dans la base de données, l’initialiseur de départ retourne 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>();
                });
    }
}

Tester 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 dans la Startup classe , de sorte 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 départ.

L’application MVC Movie s’ouvre dans Microsoft Edge avec des données de film