Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza finestra di progettazione:
Si noti l'icona a forma di chiave accanto a
ID. Per impostazione predefinita, EF crea una proprietà denominataIDper la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza dati:
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.Initializemetodo 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:
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>\.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza finestra di progettazione:
Si noti l'icona a forma di chiave accanto a
ID. Per impostazione predefinita, EF crea una proprietà denominataIDper la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza dati:
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:
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>\.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza finestra di progettazione:
Si noti l'icona a forma di chiave accanto a
ID. Per impostazione predefinita, EF crea una proprietà denominataIDper la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza dati:
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:
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>\.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza finestra di progettazione:
Si noti l'icona a forma di chiave accanto a
ID. Per impostazione predefinita, EF crea una proprietà denominataIDper la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza dati:
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:
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>\.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza finestra di progettazione:
Si noti l'icona a forma di chiave accanto a
ID. Per impostazione predefinita, EF crea una proprietà denominataIDper la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza dati:
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:
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>\.
Dal menu Visualizzazione aprire Esplora oggetti di SQL Server (SSOX).
Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza finestra di progettazione:
Si noti l'icona a forma di chiave accanto a
ID. Per impostazione predefinita, EF crea una proprietà denominataIDper la chiave primaria.Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza dati:
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 scegliere Esci o Arresta sito:
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:
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).
Fare clic con il pulsante destro del mouse sulla
Movietabella e scegliere Visualizza finestra di progettazione:
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
Movietabella e scegliere Visualizza dati:
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:
- 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: