Condividi tramite


Parte 4 della serie di esercitazioni sulle Razor pagine

Nota

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

Avviso

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 9 di questo articolo.

Importante

Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Per la versione corrente, vedere la versione .NET 9 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. 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 di configurazione principale ASP.NET legge la ConnectionString chiave. Per lo sviluppo locale, la configurazione ottiene il stringa di connessione dal appsettings.json file.

Il stringa di connessione generato è 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"
  }
}

Avviso

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 Proteggere i flussi di autenticazione.

SQL Server Express LocalDB

Local DB è una versione leggera del motore di database di SQL Server Express appositamente pensato 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, Local DB 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 Progettazione viste:

    Menu di scelta rapida aperti per la tabella Movie

    Tabelle Movie aperte nella finestra di progettazione

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, Entity Framework 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

Specificare il valore di inizializzazione del 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;
}

Aggiungere l'inizializzatore del valore di inizializzazione

Program.cs Aggiornare con il codice evidenziato seguente:

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 Program.cs precedente è stata modificata per eseguire le operazioni seguenti:

  • Ottenere un'istanza del contesto di database dal contenitore di inserimento delle dipendenze.
  • Chiamare il seedData.Initialize metodo passando all'istanza del contesto del 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'.

Testare l'app

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

L'app visualizza i dati sottoposti a seed:

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

var app = builder.Build();

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

Il stringa di connessione generato è 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"
  }
}

Avviso

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 Proteggere i flussi di autenticazione.

SQL Server Express LocalDB

Local DB è una versione leggera del motore di database di SQL Server Express appositamente pensato 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, Local DB 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 Progettazione viste:

    Menu di scelta rapida aperti per la tabella Movie

    Tabelle Movie aperte nella finestra di progettazione

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, Entity Framework 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

Specificare il valore di inizializzazione del 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;
}

Aggiungere l'inizializzatore del valore di inizializzazione

Program.cs Aggiornare con il codice evidenziato seguente:

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 Program.cs precedente è stata modificata per eseguire le operazioni seguenti:

  • Ottenere un'istanza del contesto di database dal contenitore di inserimento delle dipendenze.
  • Chiamare il seedData.Initialize metodo passando all'istanza del contesto del 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'.

Testare l'app

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

L'app visualizza i dati sottoposti a seed:

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

var app = builder.Build();

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

Il stringa di connessione generato è 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"
  }
}

Avviso

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 Proteggere i flussi di autenticazione.

SQL Server Express LocalDB

Local DB è una versione leggera del motore di database di SQL Server Express appositamente pensato 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, Local DB 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 Progettazione viste:

    Menu di scelta rapida aperti per la tabella Movie

    Tabelle Movie aperte nella finestra di progettazione

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, Entity Framework 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

Specificare il valore di inizializzazione del 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;
}

Aggiungere l'inizializzatore del valore di inizializzazione

Program.cs Aggiornare con il codice evidenziato seguente:

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 Program.cs precedente è stata modificata per eseguire le operazioni seguenti:

  • Ottenere un'istanza del contesto di database dal contenitore di inserimento delle dipendenze.
  • Chiamare il seedData.Initialize metodo passando all'istanza del contesto del 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'.

Testare l'app

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

L'app visualizza i dati sottoposti a seed:

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

var app = builder.Build();

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

Il stringa di connessione generato è 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"
  }
}

Avviso

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 Proteggere i flussi di autenticazione.

SQL Server Express LocalDB

Local DB è una versione leggera del motore di database di SQL Server Express appositamente pensato 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, Local DB 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 Progettazione viste:

    Menu di scelta rapida aperti per la tabella Movie

    Tabelle Movie aperte nella finestra di progettazione

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, Entity Framework 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

Specificare il valore di inizializzazione del 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;
}

Aggiungere l'inizializzatore del valore di inizializzazione

Program.cs Aggiornare con il codice evidenziato seguente:

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 Program.cs precedente è stata modificata per eseguire le operazioni seguenti:

  • Ottenere un'istanza del contesto di database dal contenitore di inserimento delle dipendenze.
  • Chiamare il seedData.Initialize metodo passando all'istanza del contesto del 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'.

Testare l'app

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

L'app visualizza i dati sottoposti a seed:

Applicazione movie aperta nel browser che mostra i dati dei film

Passaggi successivi

Visualizzare o scaricare il codice di esempio (procedura per il download).

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 di configurazione principale ASP.NET legge la ConnectionString chiave. Per lo sviluppo locale, la configurazione ottiene il stringa di connessione dal appsettings.json file.

Il stringa di connessione generato è 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"
  }
}

Avviso

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 Proteggere i flussi di autenticazione.

SQL Server Express LocalDB

Local DB è una versione leggera del motore di database di SQL Server Express appositamente pensato 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, Local DB 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 Progettazione viste:

    Menu di scelta rapida aperti per la tabella Movie

    Tabelle Movie aperte nella finestra di progettazione

    Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, Entity Framework 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

Specificare il valore di inizializzazione del 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;
}

Aggiungere l'inizializzatore del valore di inizializzazione

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 inserimento delle dipendenze.
  • Chiamare il seedData.Initialize metodo passando all'istanza del contesto del 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'.

Testare l'app

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

  2. Forzare l'inizializzazione dell'app chiamando i metodi nella Startup classe , quindi viene eseguito il metodo di inizializzazione. 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 dell'area di notifica di IIS Express e scegliere Esci o Arresta sito:

      Icona dell'area di notifica di IIS Express

      Menu di scelta rapida

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

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

L'app visualizza i dati sottoposti a seed:

Applicazione movie aperta nel browser che mostra i dati dei film

Passaggi successivi

Visualizzare o scaricare il codice di esempio (procedura per il download).

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 di configurazione principale ASP.NET legge la ConnectionString chiave. Per lo sviluppo locale, la configurazione ottiene il stringa di connessione dal appsettings.json file.

Il stringa di connessione generato sarà simile al 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"
  }
}

Avviso

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 Proteggere i flussi di autenticazione.

SQL Server Express LocalDB

Local DB è una versione leggera del motore di database di SQL Server Express appositamente pensato 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, Local DB 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 Progettazione viste:

    Menu di scelta rapida aperti per la tabella Movie

    Tabelle Movie aperte nella finestra di progettazione

Si noti l'icona a forma di chiave accanto a ID. Per impostazione predefinita, Entity Framework 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

Specificare il valore di inizializzazione del 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;
}

Aggiungere l'inizializzatore del valore di inizializzazione

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 inserimento delle dipendenze.
  • Chiamare il seedData.Initialize metodo passando all'istanza del contesto del 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'.

Testare l'app

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

  • Forzare l'inizializzazione dell'app chiamando i metodi nella Startup classe , quindi viene eseguito il metodo di inizializzazione. 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 dell'area di notifica di IIS Express e toccare Esci o Arresta sito:

      Icona dell'area di notifica di IIS Express

      Menu di scelta rapida

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

L'app visualizza i dati sottoposti a seed:

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

Passaggi successivi