Partie 4 de la série de tutoriels sur Pages Razor

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 Joe Audette

L’objet RazorPagesMovieContext 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 Program.cs :

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

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

La chaîne de connexion générée est similaire à la valeur JSON suivante :

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;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 de base de données de test ou de production. Pour plus d’informations, consultez Configuration.

Base de données locale SQL Server Express

LocalDB est une version allégée du moteur de base de données SQL Server Express, qui est ciblée pour le développement de programmes. LocalDB démarre à la demande et s’exécute en mode utilisateur, ce qui n’implique aucune configuration complexe. Par défaut, la base de données LocalDB crée des fichiers *.mdf dans le répertoire C:\Users\<user>\.

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

    Menu Affichage

  2. Faites un clic droit sur la table Movie et sélectionnez Concepteur de vues :

    Les menus contextuels s’ouvrent dans la table Movie

    Les tables Movie s’ouvrent 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 pour la clé primaire.

  3. Faites un clic droit sur la table Movie et sélectionnez 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 le dossier Modèles avec le code suivant :

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new RazorPagesMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<RazorPagesMovieContext>>()))
        {
            if (context == null || context.Movie == null)
            {
                throw new ArgumentNullException("Null RazorPagesMovieContext");
            }

            // 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;
}

Ajouter l’initialiseur de valeur initiale

Mettez à jour Program.cs avec le code en surbrillance suivant :

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

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

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Dans le code précédent, Program.cs a été modifié pour effectuer les opérations suivantes :

  • Obtenir une instance de contexte de base de données à partir du conteneur d’injection de dépendance.
  • Appelez la méthode seedData.Initialize en lui transmettant le contexte de base de données de l’instance.
  • Supprimer le contexte une fois la méthode seed terminée. L’instruction using garantit que le contexte est supprimé.

L’exception suivante se produit lorsque Update-Database n’a pas été exécuté :

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Tester l’application

Supprimez tous les enregistrements dans la base de données pour que la méthode seed s’exécute. Arrêtez et démarrez l’application pour amorcer la base de données. Si la base de données n’est pas amorcée, placez un point d’arrêt et if (context.Movie.Any()) parcourez le code.

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

Application Movie ouverte dans le navigateur affichant les données relatives aux films

Étapes suivantes

L’objet RazorPagesMovieContext 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 Program.cs :

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

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

La chaîne de connexion générée est similaire à la valeur JSON suivante :

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;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 de base de données de test ou de production. Pour plus d’informations, consultez Configuration.

Base de données locale SQL Server Express

LocalDB est une version allégée du moteur de base de données SQL Server Express, qui est ciblée pour le développement de programmes. LocalDB démarre à la demande et s’exécute en mode utilisateur, ce qui n’implique aucune configuration complexe. Par défaut, la base de données LocalDB crée des fichiers *.mdf dans le répertoire C:\Users\<user>\.

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

    Menu Affichage

  2. Faites un clic droit sur la table Movie et sélectionnez Concepteur de vues :

    Les menus contextuels s’ouvrent dans la table Movie

    Les tables Movie s’ouvrent 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 pour la clé primaire.

  3. Faites un clic droit sur la table Movie et sélectionnez 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 le dossier Modèles avec le code suivant :

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new RazorPagesMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<RazorPagesMovieContext>>()))
        {
            if (context == null || context.Movie == null)
            {
                throw new ArgumentNullException("Null RazorPagesMovieContext");
            }

            // 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;
}

Ajouter l’initialiseur de valeur initiale

Mettez à jour Program.cs avec le code en surbrillance suivant :

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

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

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Dans le code précédent, Program.cs a été modifié pour effectuer les opérations suivantes :

  • Obtenir une instance de contexte de base de données à partir du conteneur d’injection de dépendance.
  • Appelez la méthode seedData.Initialize en lui transmettant le contexte de base de données de l’instance.
  • Supprimer le contexte une fois la méthode seed terminée. L’instruction using garantit que le contexte est supprimé.

L’exception suivante se produit lorsque Update-Database n’a pas été exécuté :

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Tester l’application

Supprimez tous les enregistrements dans la base de données pour que la méthode seed s’exécute. Arrêtez et démarrez l’application pour amorcer la base de données. Si la base de données n’est pas amorcée, placez un point d’arrêt et if (context.Movie.Any()) parcourez le code.

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

Application Movie ouverte dans le navigateur affichant les données relatives aux films

Étapes suivantes

L’objet RazorPagesMovieContext 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 Program.cs :

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

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

La chaîne de connexion générée est similaire à la valeur JSON suivante :

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;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 de base de données de test ou de production. Pour plus d’informations, consultez Configuration.

Base de données locale SQL Server Express

LocalDB est une version allégée du moteur de base de données SQL Server Express, qui est ciblée pour le développement de programmes. LocalDB démarre à la demande et s’exécute en mode utilisateur, ce qui n’implique aucune configuration complexe. Par défaut, la base de données LocalDB crée des fichiers *.mdf dans le répertoire C:\Users\<user>\.

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

    Menu Affichage

  2. Faites un clic droit sur la table Movie et sélectionnez Concepteur de vues :

    Les menus contextuels s’ouvrent dans la table Movie

    Les tables Movie s’ouvrent 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 pour la clé primaire.

  3. Faites un clic droit sur la table Movie et sélectionnez 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 le dossier Modèles avec le code suivant :

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                if (context == null || context.Movie == null)
                {
                    throw new ArgumentNullException("Null RazorPagesMovieContext");
                }

                // 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;
}

Ajouter l’initialiseur de valeur initiale

Mettez à jour Program.cs avec le code en surbrillance suivant :

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

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

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Dans le code précédent, Program.cs a été modifié pour effectuer les opérations suivantes :

  • Obtenir une instance de contexte de base de données à partir du conteneur d’injection de dépendance.
  • Appelez la méthode seedData.Initialize en lui transmettant le contexte de base de données de l’instance.
  • Supprimer le contexte une fois la méthode seed terminée. L’instruction using garantit que le contexte est supprimé.

L’exception suivante se produit lorsque Update-Database n’a pas été exécuté :

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Tester l’application

Supprimez tous les enregistrements dans la base de données pour que la méthode seed s’exécute. Arrêtez et démarrez l’application pour amorcer la base de données. Si la base de données n’est pas amorcée, placez un point d’arrêt et if (context.Movie.Any()) parcourez le code.

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

Application Movie ouverte dans le navigateur affichant les données relatives aux films

Étapes suivantes

Affichez ou téléchargez un exemple de code (procédure de téléchargement).

L’objet RazorPagesMovieContext 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 méthode ConfigureServices dans Startup.cs :

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

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

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

La chaîne de connexion générée est similaire à la valeur JSON suivante :

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;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 de base de données de test ou de production. Pour plus d’informations, consultez Configuration.

Base de données locale SQL Server Express

LocalDB est une version allégée du moteur de base de données SQL Server Express, qui est ciblée pour le développement de programmes. LocalDB démarre à la demande et s’exécute en mode utilisateur, ce qui n’implique aucune configuration complexe. Par défaut, la base de données LocalDB crée des fichiers *.mdf dans le répertoire C:\Users\<user>\.

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

    Menu Affichage

  2. Faites un clic droit sur la table Movie et sélectionnez Concepteur de vues :

    Les menus contextuels s’ouvrent dans la table Movie

    Les tables Movie s’ouvrent 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 pour la clé primaire.

  3. Faites un clic droit sur la table Movie et sélectionnez 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 le dossier Modèles avec le code suivant :

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

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                // 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;
}

Ajouter l’initialiseur de valeur initiale

Remplacez le contenu du fichier Program.cs par le code suivant :

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;

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

Dans le code précédent, la méthode Main a été modifiée pour effectuer les opérations suivantes :

  • Obtenir une instance de contexte de base de données à partir du conteneur d’injection de dépendance.
  • Appelez la méthode seedData.Initialize en lui transmettant le contexte de base de données de l’instance.
  • Supprimer le contexte une fois la méthode seed terminée. L’instruction using garantit que le contexte est supprimé.

L’exception suivante se produit lorsque Update-Database n’a pas été exécuté :

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Tester l’application

  1. Supprimez tous les enregistrements de la base de données. Utilisez les liens de suppression dans le navigateur ou à partir de SSOX

  2. 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é. Arrêtez et redémarrez IIS avec l’une des approches suivantes :

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

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

      Menu contextuel

    2. Si l’application s’exécute en mode non débogage, appuyez sur F5 pour l’exécuter en mode débogage.

    3. Si l’application est en mode débogage, arrêtez le débogueur et appuyez sur F5.

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

Application Movie ouverte dans le navigateur affichant les données relatives aux films

Étapes suivantes

Affichez ou téléchargez un exemple de code (procédure de téléchargement).

L’objet RazorPagesMovieContext 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 méthode ConfigureServices dans Startup.cs :

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

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

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

La chaîne de connexion sera semblable à la sortie suivante :

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;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 de base de données de test ou de production. Pour plus d’informations, consultez Configuration.

Base de données locale SQL Server Express

LocalDB est une version allégée du moteur de base de données SQL Server Express, qui est ciblée pour le développement de programmes. LocalDB démarre à la demande et s’exécute en mode utilisateur, ce qui n’implique aucune configuration complexe. Par défaut, la base de données LocalDB crée des fichiers *.mdf dans le répertoire C:\Users\<user>\.

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

    Menu Affichage

  • Faites un clic droit sur la table Movie et sélectionnez Concepteur de vues :

    Les menus contextuels s’ouvrent dans la table Movie

    Les tables Movie s’ouvrent 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 pour la clé primaire.

  • Faites un clic droit sur la table Movie et sélectionnez 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 le dossier Modèles avec le code suivant :

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

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                // 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;
}

Ajouter l’initialiseur de valeur initiale

Remplacez le contenu du fichier Program.cs par le code suivant :

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;

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

Dans le code précédent, la méthode Main a été modifiée pour effectuer les opérations suivantes :

  • Obtenir une instance de contexte de base de données à partir du conteneur d’injection de dépendance.
  • Appelez la méthode seedData.Initialize en lui transmettant le contexte de base de données de l’instance.
  • Supprimer le contexte une fois la méthode seed terminée. L’instruction using garantit que le contexte est supprimé.

L’exception suivante se produit lorsque Update-Database n’a pas été exécuté :

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Tester l’application

  • Supprimez tous les enregistrements de la base de données. Utilisez les liens de suppression 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é. Arrêtez et redémarrez IIS avec 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 l’application s’exécute en mode non débogage, appuyez sur F5 pour l’exécuter en mode débogage.
      • Si l’application est en mode débogage, arrêtez le débogueur et appuyez sur F5.

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

Application Movie ouverte dans Chrome, affichant les données relatives aux films

Étapes suivantes