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 8 di questo articolo.
Avviso
Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere Criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 8 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 8 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>\
.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Progettazione viste:Si noti l'icona a forma di chiave accanto a
ID
. Per impostazione predefinita, Entity Framework crea una proprietà denominataID
per la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Visualizza dati:
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:
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>\
.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Progettazione viste:Si noti l'icona a forma di chiave accanto a
ID
. Per impostazione predefinita, Entity Framework crea una proprietà denominataID
per la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Visualizza dati:
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:
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>\
.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Progettazione viste:Si noti l'icona a forma di chiave accanto a
ID
. Per impostazione predefinita, Entity Framework crea una proprietà denominataID
per la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Visualizza dati:
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:
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>\
.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Progettazione viste:Si noti l'icona a forma di chiave accanto a
ID
. Per impostazione predefinita, Entity Framework crea una proprietà denominataID
per la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Visualizza dati:
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:
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>\
.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Progettazione viste:Si noti l'icona a forma di chiave accanto a
ID
. Per impostazione predefinita, Entity Framework crea una proprietà denominataID
per la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Visualizza dati:
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 scegliere Esci o Arresta sito:
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:
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).
Fare clic con il pulsante destro del mouse sulla
Movie
tabella e scegliere Progettazione viste:
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:
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:
- 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: