Parte 4 della serie di tutorial sulle Razor pagine

Note

Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 10 di questo articolo.

Warning

Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere i criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 10 di questo articolo.

Di Joe Audette

L'oggetto RazorPagesMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Registrare il contesto del database con il contenitore di dependency injection in Program.cs:

using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.");

builder.Services.AddDbContext<RazorPagesMovieContext>(options => options.UseSqlServer(connectionString));

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

Il sistema Configuration di ASP.NET Core legge la chiave ConnectionString. Per lo sviluppo locale, la configurazione ottiene la stringa di connessione dal appsettings.json file .

La stringa di connessione generata è simile al codice JSON seguente:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-f2e0482c-952d-4b1c-afe9-a1a3dfe52e55;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Warning

Questo articolo usa un database locale che non richiede l'autenticazione dell'utente. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app di test e produzione distribuite, vedere Flussi di autenticazione sicuri.

SQL Server Express LocalDB (database locale di SQL Server Express)

LocalDB è una versione leggera del motore di database sql Server Express progettato per lo sviluppo di programmi. Local DB viene avviato su richiesta ed eseguito in modalità utente; non richiede quindi una configurazione complessa. Per impostazione predefinita, LocalDB crea *.mdf file di database nella C:\Users\<user>\ directory.

  1. Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

    Menu Visualizza che mostra l'opzione 'Esplora oggetti di SQL Server'.

  2. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza finestra di progettazione:

    I menu contestuali si aprono sulla tabella Film.

    Le tabelle dei film si aprono in Designer.

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID per la chiave primaria.

  3. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza dati:

    Tabella movie aperta che mostra i dati della tabella.

Popolare il database

Creare una nuova classe denominata SeedData nella cartella Models usando il codice seguente:

using Microsoft.EntityFrameworkCore;

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

Se il database contiene qualche film, il seed initializer si interrompe e non aggiunge alcun film.

if (context.Movie.Any())
{
    return;
}

Aggiungi l'inizializzatore seed

Eseguire l'aggiornamento Program.cs con il codice evidenziato seguente:

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.");

builder.Services.AddDbContext<RazorPagesMovieContext>(options => options.UseSqlServer(connectionString));

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

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("/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.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages()
   .WithStaticAssets();

app.Run();

Nel codice precedente si modifica Program.cs per eseguire la procedura seguente:

  • Creare un ambito di servizio con app.Services.CreateScope().
  • Recupera il fornitore di servizi (IServiceProvider) dallo scope.
  • Chiamare il SeedData.Initialize metodo passando il provider di servizi.
  • Rilasciare l'ambito del servizio quando il metodo seed viene completato. L'usingistruzione garantisce che il contesto venga rilasciato.

L'eccezione seguente si verifica quando non si esegue Update-Database:

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

Testa l'app

Eliminare tutti i record nel database in modo che venga eseguito il metodo di inizializzazione. Chiudi e avvia l'app per inizializzare il database. Se il database non è sottoposto a seeding, inserire un punto if (context.Movie.Any()) di interruzione e procedere passo passo nel codice.

L'app visualizza i dati inizializzati:

Applicazione movie aperta nel browser che mostra i dati dei film.

Passaggi successivi

L'oggetto RazorPagesMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection in 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.")));

Il sistema Configuration di ASP.NET Core legge la chiave ConnectionString. Per lo sviluppo locale, la configurazione ottiene la stringa di connessione dal appsettings.json file.

La stringa di connessione generata è simile al codice JSON seguente:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-f2e0482c-952d-4b1c-afe9-a1a3dfe52e55;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Warning

Questo articolo usa un database locale che non richiede l'autenticazione dell'utente. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app di test e produzione distribuite, vedere Flussi di autenticazione sicuri.

SQL Server Express LocalDB (database locale di SQL Server Express)

LocalDB è una versione leggera del motore di database SQL Server Express destinata allo sviluppo di programmi. Local DB viene avviato su richiesta ed eseguito in modalità utente; non richiede quindi una configurazione complessa. Per impostazione predefinita, il database LocalDB crea file con estensione *.mdf nella directory C:\Users\<user>\.

  1. Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

    Menu Visualizza

  2. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza finestra di progettazione:

    I menu contestuali si aprono sulla tabella Movie

    Tabelle Movie aperte in Designer

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID per la chiave primaria.

  3. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza dati:

    Tabella Movie aperta con i dati della tabella

Popolare il database

Creare una nuova classe denominata SeedData nella cartella Models usando il codice seguente:

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

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;
}

Aggiungi l'inizializzatore seed

Aggiornare il Program.cs con il seguente codice evidenziato:

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.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages();

app.Run();

Nel codice precedente, Program.cs è stato modificato per eseguire le operazioni seguenti:

  • Creare un ambito di servizio con app.Services.CreateScope().
  • Recupera il fornitore di servizi (IServiceProvider) dallo scope.
  • Chiamare il metodo SeedData.Initialize, passandogli il provider di servizi.
  • Rilasciare l'ambito del servizio quando il metodo seed viene completato. L'usingistruzione garantisce che il contesto venga rilasciato.

L'eccezione seguente si verifica quando Update-Database non è stata eseguita:

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

Testa l'app

Eliminare tutti i record nel database in modo che venga eseguito il metodo di inizializzazione. Chiudi e avvia l'app per inizializzare il database. Se il database non è sottoposto a seeding, inserire un punto if (context.Movie.Any()) di interruzione e procedere passo passo nel codice.

L'app visualizza i dati inizializzati:

Applicazione film aperta nel browser che mostra i dati dei film

Passaggi successivi

L'oggetto RazorPagesMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection in 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();

Il sistema Configuration di ASP.NET Core legge la chiave ConnectionString. Per lo sviluppo locale, la configurazione ottiene la stringa di connessione dal appsettings.json file.

La stringa di connessione generata è simile al codice JSON seguente:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Warning

Questo articolo usa un database locale che non richiede l'autenticazione dell'utente. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app di test e produzione distribuite, vedere Flussi di autenticazione sicuri.

SQL Server Express LocalDB (database locale di SQL Server Express)

LocalDB è una versione leggera del motore di database SQL Server Express destinata allo sviluppo di programmi. Local DB viene avviato su richiesta ed eseguito in modalità utente; non richiede quindi una configurazione complessa. Per impostazione predefinita, il database LocalDB crea file con estensione *.mdf nella directory C:\Users\<user>\.

  1. Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

    Menu Visualizza

  2. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza finestra di progettazione:

    I menu contestuali si aprono sulla tabella Movie

    Tabelle Movie aperte in Designer

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID per la chiave primaria.

  3. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza dati:

    Tabella Movie aperta con i dati della tabella

Popolare il database

Creare una nuova classe denominata SeedData nella cartella Models usando il codice seguente:

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

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;
}

Aggiungi l'inizializzatore seed

Aggiornare il Program.cs con il seguente codice evidenziato:

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

Nel codice precedente, Program.cs è stato modificato per eseguire le operazioni seguenti:

  • Creare un ambito di servizio con app.Services.CreateScope().
  • Recupera il fornitore di servizi (IServiceProvider) dallo scope.
  • Chiamare il metodo SeedData.Initialize, passandogli il provider di servizi.
  • Rilasciare l'ambito del servizio quando il metodo seed viene completato. L'usingistruzione garantisce che il contesto venga rilasciato.

L'eccezione seguente si verifica quando Update-Database non è stata eseguita:

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

Testa l'app

Eliminare tutti i record nel database in modo che venga eseguito il metodo di inizializzazione. Chiudi e avvia l'app per inizializzare il database. Se il database non è sottoposto a seeding, inserire un punto if (context.Movie.Any()) di interruzione e procedere passo passo nel codice.

L'app visualizza i dati inizializzati:

Applicazione film aperta nel browser che mostra i dati dei film

Passaggi successivi

L'oggetto RazorPagesMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection in 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();

Il sistema Configuration di ASP.NET Core legge la chiave ConnectionString. Per lo sviluppo locale, la configurazione ottiene la stringa di connessione dal appsettings.json file.

La stringa di connessione generata è simile al codice JSON seguente:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Warning

Questo articolo usa un database locale che non richiede l'autenticazione dell'utente. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app di test e produzione distribuite, vedere Flussi di autenticazione sicuri.

SQL Server Express LocalDB (database locale di SQL Server Express)

LocalDB è una versione leggera del motore di database SQL Server Express destinata allo sviluppo di programmi. Local DB viene avviato su richiesta ed eseguito in modalità utente; non richiede quindi una configurazione complessa. Per impostazione predefinita, il database LocalDB crea file con estensione *.mdf nella directory C:\Users\<user>\.

  1. Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

    Menu Visualizza

  2. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza finestra di progettazione:

    I menu contestuali si aprono sulla tabella Movie

    Tabelle Movie aperte in Designer

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID per la chiave primaria.

  3. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza dati:

    Tabella Movie aperta con i dati della tabella

Popolare il database

Creare una nuova classe denominata SeedData nella cartella Models usando il codice seguente:

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

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;
}

Aggiungi l'inizializzatore seed

Aggiornare il Program.cs con il seguente codice evidenziato:

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

Nel codice precedente, Program.cs è stato modificato per eseguire le operazioni seguenti:

  • Ottenere un'istanza del contesto di database dal contenitore di iniezione delle dipendenze (DI).
  • Chiamare il metodo seedData.Initialize, passandogli l'istanza del contesto di database.
  • Eliminare il contesto dopo che il metodo di inizializzazione è stato completato. L'istruzione using garantisce che il contesto venga eliminato.

L'eccezione seguente si verifica quando Update-Database non è stata eseguita:

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

Testa l'app

Eliminare tutti i record nel database in modo che venga eseguito il metodo di inizializzazione. Chiudi e avvia l'app per inizializzare il database. Se il database non è sottoposto a seeding, inserire un punto if (context.Movie.Any()) di interruzione e procedere passo passo nel codice.

L'app visualizza i dati inizializzati:

Applicazione film aperta nel browser che mostra i dati dei film

Passaggi successivi

L'oggetto RazorPagesMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection in 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();

Il sistema Configuration di ASP.NET Core legge la chiave ConnectionString. Per lo sviluppo locale, la configurazione ottiene la stringa di connessione dal appsettings.json file.

La stringa di connessione generata è simile al codice JSON seguente:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Warning

Questo articolo usa un database locale che non richiede l'autenticazione dell'utente. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app di test e produzione distribuite, vedere Flussi di autenticazione sicuri.

SQL Server Express LocalDB (database locale di SQL Server Express)

LocalDB è una versione leggera del motore di database SQL Server Express destinata allo sviluppo di programmi. Local DB viene avviato su richiesta ed eseguito in modalità utente; non richiede quindi una configurazione complessa. Per impostazione predefinita, il database LocalDB crea file con estensione *.mdf nella directory C:\Users\<user>\.

  1. Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

    Menu Visualizza

  2. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza finestra di progettazione:

    I menu contestuali si aprono sulla tabella Movie

    Tabelle Movie aperte in Designer

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID per la chiave primaria.

  3. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza dati:

    Tabella Movie aperta con i dati della tabella

Popolare il database

Creare una nuova classe denominata SeedData nella cartella Models usando il codice seguente:

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

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;
}

Aggiungi l'inizializzatore seed

Aggiornare il Program.cs con il seguente codice evidenziato:

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

Nel codice precedente, Program.cs è stato modificato per eseguire le operazioni seguenti:

  • Ottenere un'istanza del contesto di database dal contenitore di iniezione delle dipendenze (DI).
  • Chiamare il metodo seedData.Initialize, passandogli l'istanza del contesto di database.
  • Eliminare il contesto dopo che il metodo di inizializzazione è stato completato. L'istruzione using garantisce che il contesto venga eliminato.

L'eccezione seguente si verifica quando Update-Database non è stata eseguita:

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

Testa l'app

Eliminare tutti i record nel database in modo che venga eseguito il metodo di inizializzazione. Chiudi e avvia l'app per inizializzare il database. Se il database non è sottoposto a seeding, inserire un punto if (context.Movie.Any()) di interruzione e procedere passo passo nel codice.

L'app visualizza i dati inizializzati:

Applicazione film aperta nel browser che mostra i dati dei film

Passaggi successivi

Visualizza o scarica il codice di esempio (come scaricare).

L'oggetto RazorPagesMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection nel ConfigureServices metodo in Startup.cs:

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

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

Il sistema Configuration di ASP.NET Core legge la chiave ConnectionString. Per lo sviluppo locale, la configurazione ottiene la stringa di connessione dal appsettings.json file.

La stringa di connessione generata è simile al codice JSON seguente:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Warning

Questo articolo usa un database locale che non richiede l'autenticazione dell'utente. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app di test e produzione distribuite, vedere Flussi di autenticazione sicuri.

SQL Server Express LocalDB (database locale di SQL Server Express)

LocalDB è una versione leggera del motore di database SQL Server Express destinata allo sviluppo di programmi. Local DB viene avviato su richiesta ed eseguito in modalità utente; non richiede quindi una configurazione complessa. Per impostazione predefinita, il database LocalDB crea file con estensione *.mdf nella directory C:\Users\<user>\.

  1. Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

    Menu Visualizza

  2. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza finestra di progettazione:

    I menu contestuali si aprono sulla tabella Movie

    Tabelle Movie aperte in Designer

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID per la chiave primaria.

  3. Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza dati:

    Tabella Movie aperta con i dati della tabella

Popolare il database

Creare una nuova classe denominata SeedData nella cartella Models usando il codice seguente:

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

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;
}

Aggiungi l'inizializzatore seed

Sostituire il contenuto di Program.cs con il codice seguente:

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

Nel codice precedente il Main metodo è stato modificato per eseguire le operazioni seguenti:

  • Ottenere un'istanza del contesto di database dal contenitore di dependency injection.
  • Chiamare il metodo seedData.Initialize, passandogli l'istanza del contesto di database.
  • Eliminare il contesto dopo che il metodo di inizializzazione è stato completato. L'istruzione using garantisce che il contesto venga eliminato.

L'eccezione seguente si verifica quando Update-Database non è stata eseguita:

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

Testa l'app

  1. Eliminare tutti i record del database. Usare i collegamenti di eliminazione nel browser o da SSOX

  2. Forza l'inizializzazione dell'app chiamando i metodi nella classe Startup, in modo che venga eseguito il metodo seed. Per forzare l'inizializzazione, IIS Express deve essere arrestato e riavviato. Arrestare e riavviare IIS con uno degli approcci seguenti:

    1. Fare clic con il pulsante destro del mouse sull'icona di IIS Express nell'area di notifica e scegliere Esci o Arresta sito:

      Icona dell'area di notifica di IIS Express

      Menu contestuale

    2. Se l'app è in esecuzione in modalità non debug, premere F5 per avviarla in modalità debug.

    3. Se l'app è in modalità di debug, arrestare il debugger e premere F5.

L'app visualizza i dati inizializzati:

Applicazione film aperta nel browser che mostra i dati dei film

Passaggi successivi

Visualizza o scarica il codice di esempio (come scaricare).

L'oggetto RazorPagesMovieContext gestisce l'attività di connessione al database e di mapping degli oggetti Movie ai record di database. Il contesto del database viene registrato con il contenitore Dependency Injection nel ConfigureServices metodo in Startup.cs:

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

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

Il sistema Configuration di ASP.NET Core legge la chiave ConnectionString. Per lo sviluppo locale, la configurazione ottiene la stringa di connessione dal appsettings.json file.

La stringa di connessione generata sarà simile alla seguente:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Warning

Questo articolo usa un database locale che non richiede l'autenticazione dell'utente. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app di test e produzione distribuite, vedere Flussi di autenticazione sicuri.

SQL Server Express LocalDB (database locale di SQL Server Express)

LocalDB è una versione leggera del motore di database SQL Server Express destinata allo sviluppo di programmi. Local DB viene avviato su richiesta ed eseguito in modalità utente; non richiede quindi una configurazione complessa. Per impostazione predefinita, il database LocalDB crea file con estensione *.mdf nella directory C:\Users\<user>\.

  • Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).

    Menu Visualizza

  • Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza finestra di progettazione:

    I menu contestuali si aprono sulla tabella Movie

    Tabelle Movie aperte in Designer

Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, EF crea una proprietà denominata ID per la chiave primaria.

  • Fare clic con il pulsante destro del mouse sulla Movie tabella e scegliere Visualizza dati:

    Tabella Movie aperta con i dati della tabella

Popolare il database

Creare una nuova classe denominata SeedData nella cartella Models usando il codice seguente:

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

Se nel database sono presenti film, l'inizializzatore di inizializzazione di inizializzazione restituisce e non vengono aggiunti film.

if (context.Movie.Any())
{
    return;
}

Aggiungi l'inizializzatore seed

Sostituire il contenuto di Program.cs con il codice seguente:

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

Nel codice precedente il Main metodo è stato modificato per eseguire le operazioni seguenti:

  • Ottenere un'istanza del contesto di database dal contenitore di dependency injection.
  • Chiamare il metodo seedData.Initialize, passandogli l'istanza del contesto di database.
  • Eliminare il contesto dopo che il metodo di inizializzazione è stato completato. L'istruzione using garantisce che il contesto venga eliminato.

L'eccezione seguente si verifica quando Update-Database non è stata eseguita:

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

Testa l'app

  • Eliminare tutti i record del database. Usare i collegamenti di eliminazione nel browser o da SSOX.

  • Forza l'inizializzazione dell'app chiamando i metodi nella classe Startup, in modo che venga eseguito il metodo seed. Per forzare l'inizializzazione, IIS Express deve essere arrestato e riavviato. Arrestare e riavviare IIS con uno degli approcci seguenti:

    • Fare clic con il pulsante destro del mouse sull'icona di IIS Express nell'area di notifica e toccare Esci o Arresta sito:

      Icona dell'area di notifica di IIS Express

      Menu contestuale

      • Se l'app è in esecuzione in modalità non debug, premere F5 per avviarla in modalità debug.
      • Se l'app è in modalità di debug, arrestare il debugger e premere F5.

L'app visualizza i dati inizializzati:

App per i film aperta in Chrome con i dati sui film

Passaggi successivi