Parte 2, aggiungere un modello a un'app Razor Pages in ASP.NET Core
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.
In questa esercitazione vengono aggiunte classi per la gestione dei film in un database. Le classi di modello dell'app usano Entity Framework Core (EF Core) per lavorare con il database. EF Core è un mapper relazionale a oggetti (O/RM) che semplifica l'accesso ai dati. Per prima cosa si scrivono le classi del modello e EF Core si crea il database.
Le classi del modello sono note come classi POCO (da "Plain-O ld CLR Objects") perché non hanno una dipendenza da EF Core. Definiscono le proprietà dei dati archiviati nel database.
Aggiungere un modello di dati
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto> RazorPagesMovie Aggiungi>nuova cartella. Denominare la cartella
Models
.Fare clic con il pulsante destro del mouse sulla
Models
cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.Aggiungere le proprietà seguenti alla classe
Movie
:using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models; public class Movie { public int Id { get; set; } public string? Title { get; set; } [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string? Genre { get; set; } public decimal Price { get; set; } }
La classe Movie
contiene:
Il campo
ID
è richiesto dal database per la chiave primaria.Attributo [DataType] che specifica il tipo di dati nella
ReleaseDate
proprietà . Con questo attributo:- L'utente non deve immettere le informazioni sull'ora nel campo data.
- Viene visualizzata solo la data, non le informazioni temporali.
Il punto interrogativo dopo
string
indica che la proprietà è nullable. Per altre informazioni, vedere Tipi di riferimento Nullable.
L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.
Compilare il progetto per verificare che non siano presenti errori di compilazione.
Eseguire lo scaffolding del modello di filmato
In questa sezione viene eseguito lo scaffolding del modello *Movie*. Lo strumento di scaffolding crea quindi le pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello di filmato.
Creare la cartella Pages/Movies :
- Fare clic con il pulsante destro del mouse sulla cartella Pages Aggiungi>nuova cartella.>
- Assegnare alla cartella il nome Movies.
Fare clic con il pulsante destro del mouse sulla cartella> Pages/Movies Aggiungi>nuovo elemento con scaffolding.
Nella finestra di dialogo Aggiungi nuovo scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.
Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):
- Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
- Nella riga Classe contesto di dati selezionare il segno più +.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
RazorPagesMovie.Data.RazorPagesMovieContext
della classe. - Nell'elenco a discesa Provider di database selezionare SQL Server.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
- Selezionare Aggiungi.
Il appsettings.json
file viene aggiornato con il stringa di connessione utilizzato per connettersi a un database locale.
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.
File creati e aggiornati
Il processo di scaffolding crea i file seguenti:
- Pages/Movies: pagine Create (Crea), Delete (Elimina), Details (Dettagli), Edit (Modifica) e Index (Indice).
Data/RazorPagesMovieContext.cs
I file creati sono illustrati nell'esercitazione successiva.
Il processo di scaffolding aggiunge il codice evidenziato seguente al Program.cs
file:
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();
// 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();
app.Run();
Le Program.cs
modifiche vengono illustrate più avanti in questa esercitazione.
Creare lo schema del database iniziale usando la funzionalità di migrazione di Entity Framework
La funzionalità delle migrazioni in Entity Framework Core consente di:
- Creare lo schema del database iniziale.
- Aggiornare in modo incrementale lo schema del database per mantenerlo sincronizzato con il modello di dati dell'app. I dati esistenti nel database sono mantenuti.
In questa sezione viene usata la finestra Gestione pacchetti Console (PMC) per:
Aggiungere una migrazione iniziale.
Aggiornare il database con la migrazione iniziale.
Nel menu Strumenti selezionare Gestione pacchetti NuGet>Console di Gestione pacchetti.
In PMC immettere il comando seguente:
Add-Migration InitialCreate
Il comando
Add-Migration
genera un codice per creare lo schema del database iniziale. Lo schema si basa sul modello specificato inDbContext
. L'argomentoInitialCreate
viene usato per denominare la migrazione. È possibile usare qualsiasi nome, ma per convenzione viene selezionato un nome che descrive la migrazione.
Viene visualizzato l'avviso seguente, risolto in un passaggio successivo:
No type was specified for the decimal column 'Price' on entity type 'Movie'. (Nessun tipo specificato per la colonna decimale 'Price' nel tipo di entità 'Movie'). This will cause values to be silently truncated if they do not fit in the default precision and scale. (I valori saranno quindi automaticamente troncati se non rispettano la precisione e la scala predefinite). Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'. (Specificare in modo esplicito il tipo di colonna di SQL Server che può supportare tutti i valori usando 'HasColumnType()').
In PMC immettere il comando seguente:
Update-Database
Il
Update-Database
comando esegue ilUp
metodo nelle migrazioni che non sono state applicate. In questo caso, il comando esegue ilUp
metodo nelMigrations/<time-stamp>_InitialCreate.cs
file , che crea il database.
Contesto dati RazorPagesMovieContext
:
- Deriva da Microsoft.EntityFrameworkCore.DbContext.
- Specifica le entità incluse nel modello di dati.
- Coordina la EF Core funzionalità, ad esempio Crea, Lettura, Aggiorna ed Elimina, per il
Movie
modello.
Classe RazorPagesMovieContext
nel file Data/RazorPagesMovieContext.cs
generato :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
}
}
Il codice precedente crea una proprietà DbSet<Movie> per il set di entità. Nella terminologia di Entity Framework, un set di entità corrisponde in genere alla tabella di un database. Un'entità corrisponde a una riga nella tabella.
Il nome della stringa di connessione viene passato al contesto chiamando un metodo in un oggetto DbContextOptions. Per lo sviluppo locale, il sistema di configurazione legge il stringa di connessione dal appsettings.json
file.
Testare l'app
Eseguire l'app e accodare
/Movies
all'URL nel browser (http://localhost:port/movies
).Se si riceve un messaggio di errore che indica che
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Non è stato eseguita la migrazione.
Testare il collegamento Crea nuovo .
Nota
Potrebbe non essere possibile immettere virgole decimali nel campo
Price
. Per supportare la convalida jQuery per impostazioni locali diverse dall'inglese che usano la virgola (",") come separatore decimale e per formati di data diversi da quello dell'inglese (Stati Uniti), è necessario localizzare l'app. Per istruzioni sulla localizzazione, vedere questo problema su GitHub.Testare i collegamenti Modifica, Dettagli ed Elimina.
L'esercitazione successiva illustra i file creati tramite scaffolding.
Esaminare il contesto registrato con l'inserimento di dipendenze
ASP.NET Core viene compilato con l'inserimento di dipendenze. I servizi, ad esempio il contesto del database, vengono registrati con inserimento delle dipendenze durante l'avvio EF Core dell'applicazione. I componenti che richiedono questi servizi (ad esempio Razor Pages) vengono forniti tramite parametri del costruttore. Più avanti nell'esercitazione viene illustrato il codice del costruttore che ottiene un'istanza del contesto di database.
Lo strumento di scaffolding ha creato automaticamente un contesto di database e lo ha registrato con il contenitore di inserimento delle dipendenze. Il codice evidenziato seguente viene aggiunto al Program.cs
file dallo scaffolder:
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();
// 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();
app.Run();
Risoluzione dei problemi con l'esempio completato
Se si verifica un problema che non è possibile risolvere, confrontare il codice con il progetto completato. Visualizzare o scaricare il progetto completato (come scaricare).
Passaggi successivi
In questa esercitazione vengono aggiunte classi per la gestione dei film in un database. Le classi di modello dell'app usano Entity Framework Core (EF Core) per lavorare con il database. EF Core è un mapper relazionale a oggetti (O/RM) che semplifica l'accesso ai dati. Per prima cosa si scrivono le classi del modello e EF Core si crea il database.
Le classi del modello sono note come classi POCO (da "Plain-O ld CLR Objects") perché non hanno una dipendenza da EF Core. Definiscono le proprietà dei dati archiviati nel database.
Aggiungere un modello di dati
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto> RazorPagesMovie Aggiungi>nuova cartella. Denominare la cartella
Models
.Fare clic con il pulsante destro del mouse sulla
Models
cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.Aggiungere le proprietà seguenti alla classe
Movie
:using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models; public class Movie { public int Id { get; set; } public string? Title { get; set; } [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string? Genre { get; set; } public decimal Price { get; set; } }
La classe Movie
contiene:
Il campo
ID
è richiesto dal database per la chiave primaria.Attributo [DataType] che specifica il tipo di dati nella
ReleaseDate
proprietà . Con questo attributo:- L'utente non deve immettere le informazioni sull'ora nel campo data.
- Viene visualizzata solo la data, non le informazioni temporali.
Il punto interrogativo dopo
string
indica che la proprietà è nullable. Per altre informazioni, vedere Tipi di riferimento Nullable.
L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.
Compilare il progetto per verificare che non siano presenti errori di compilazione.
Eseguire lo scaffolding del modello di filmato
In questa sezione viene eseguito lo scaffolding del modello *Movie*. Lo strumento di scaffolding crea quindi le pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello di filmato.
Creare la cartella Pages/Movies :
- Fare clic con il pulsante destro del mouse sulla cartella Pages Aggiungi>nuova cartella.>
- Assegnare alla cartella il nome Movies.
Fare clic con il pulsante destro del mouse sulla cartella> Pages/Movies Aggiungi>nuovo elemento con scaffolding.
Nella finestra di dialogo Aggiungi nuovo scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.
Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):
- Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
- Nella riga Classe contesto di dati selezionare il segno più +.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
RazorPagesMovie.Data.RazorPagesMovieContext
della classe. - Nell'elenco a discesa Provider di database selezionare SQL Server.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
- Selezionare Aggiungi.
Il appsettings.json
file viene aggiornato con il stringa di connessione utilizzato per connettersi a un database locale.
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.
File creati e aggiornati
Il processo di scaffolding crea i file seguenti:
- Pages/Movies: pagine Create (Crea), Delete (Elimina), Details (Dettagli), Edit (Modifica) e Index (Indice).
Data/RazorPagesMovieContext.cs
I file creati sono illustrati nell'esercitazione successiva.
Il processo di scaffolding aggiunge il codice evidenziato seguente al Program.cs
file:
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();
// 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.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Le Program.cs
modifiche vengono illustrate più avanti in questa esercitazione.
Creare lo schema del database iniziale usando la funzionalità di migrazione di Entity Framework
La funzionalità delle migrazioni in Entity Framework Core consente di:
- Creare lo schema del database iniziale.
- Aggiornare in modo incrementale lo schema del database per mantenerlo sincronizzato con il modello di dati dell'app. I dati esistenti nel database sono mantenuti.
In questa sezione viene usata la finestra Gestione pacchetti Console (PMC) per:
Aggiungere una migrazione iniziale.
Aggiornare il database con la migrazione iniziale.
Nel menu Strumenti selezionare Gestione pacchetti NuGet>Console di Gestione pacchetti.
In PMC immettere il comando seguente:
Add-Migration InitialCreate
Il comando
Add-Migration
genera un codice per creare lo schema del database iniziale. Lo schema si basa sul modello specificato inDbContext
. L'argomentoInitialCreate
viene usato per denominare la migrazione. È possibile usare qualsiasi nome, ma per convenzione viene selezionato un nome che descrive la migrazione.
Viene visualizzato l'avviso seguente, risolto in un passaggio successivo:
No type was specified for the decimal column 'Price' on entity type 'Movie'. (Nessun tipo specificato per la colonna decimale 'Price' nel tipo di entità 'Movie'). This will cause values to be silently truncated if they do not fit in the default precision and scale. (I valori saranno quindi automaticamente troncati se non rispettano la precisione e la scala predefinite). Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'. (Specificare in modo esplicito il tipo di colonna di SQL Server che può supportare tutti i valori usando 'HasColumnType()').
In PMC immettere il comando seguente:
Update-Database
Il
Update-Database
comando esegue ilUp
metodo nelle migrazioni che non sono state applicate. In questo caso, il comando esegue ilUp
metodo nelMigrations/<time-stamp>_InitialCreate.cs
file , che crea il database.
Contesto dati RazorPagesMovieContext
:
- Deriva da Microsoft.EntityFrameworkCore.DbContext.
- Specifica le entità incluse nel modello di dati.
- Coordina la EF Core funzionalità, ad esempio Crea, Lettura, Aggiorna ed Elimina, per il
Movie
modello.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
}
}
Il codice precedente crea una proprietà DbSet<Movie> per il set di entità. Nella terminologia di Entity Framework, un set di entità corrisponde in genere alla tabella di un database. Un'entità corrisponde a una riga nella tabella.
Il nome della stringa di connessione viene passato al contesto chiamando un metodo in un oggetto DbContextOptions. Per lo sviluppo locale, il sistema di configurazione legge il stringa di connessione dal appsettings.json
file.
Testare l'app
Eseguire l'app e accodare
/Movies
all'URL nel browser (http://localhost:port/movies
).Se si riceve un messaggio di errore che indica che
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Non è stato eseguita la migrazione.
Testare il collegamento Crea nuovo .
Nota
Potrebbe non essere possibile immettere virgole decimali nel campo
Price
. Per supportare la convalida jQuery per impostazioni locali diverse dall'inglese che usano la virgola (",") come separatore decimale e per formati di data diversi da quello dell'inglese (Stati Uniti), è necessario localizzare l'app. Per istruzioni sulla localizzazione, vedere questo problema su GitHub.Testare i collegamenti Modifica, Dettagli ed Elimina.
L'esercitazione successiva illustra i file creati tramite scaffolding.
Esaminare il contesto registrato con l'inserimento di dipendenze
ASP.NET Core viene compilato con l'inserimento di dipendenze. I servizi, ad esempio il contesto del database, vengono registrati con inserimento delle dipendenze durante l'avvio EF Core dell'applicazione. I componenti che richiedono questi servizi (ad esempio Razor Pages) vengono forniti tramite parametri del costruttore. Più avanti nell'esercitazione viene illustrato il codice del costruttore che ottiene un'istanza del contesto di database.
Lo strumento di scaffolding ha creato automaticamente un contesto di database e lo ha registrato con il contenitore di inserimento delle dipendenze. Il codice evidenziato seguente viene aggiunto al Program.cs
file dallo scaffolder:
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();
// 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.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Risoluzione dei problemi con l'esempio completato
Se si verifica un problema che non è possibile risolvere, confrontare il codice con il progetto completato. Visualizzare o scaricare il progetto completato (come scaricare).
Passaggi successivi
In questa esercitazione vengono aggiunte classi per la gestione dei film in un database. Le classi di modello dell'app usano Entity Framework Core (EF Core) per lavorare con il database. EF Core è un mapper relazionale a oggetti (O/RM) che semplifica l'accesso ai dati. Per prima cosa si scrivono le classi del modello e EF Core si crea il database.
Le classi del modello sono note come classi POCO (da "Plain-O ld CLR Objects") perché non hanno una dipendenza da EF Core. Definiscono le proprietà dei dati archiviati nel database.
Aggiungere un modello di dati
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto> RazorPagesMovie Aggiungi>nuova cartella. Denominare la cartella
Models
.Fare clic con il pulsante destro del mouse sulla
Models
cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.Aggiungere le proprietà seguenti alla classe
Movie
:using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models; public class Movie { public int Id { get; set; } public string? Title { get; set; } [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string? Genre { get; set; } public decimal Price { get; set; } }
La classe Movie
contiene:
Il campo
ID
è richiesto dal database per la chiave primaria.Attributo [DataType] che specifica il tipo di dati nella
ReleaseDate
proprietà . Con questo attributo:- L'utente non deve immettere le informazioni sull'ora nel campo data.
- Viene visualizzata solo la data, non le informazioni temporali.
Il punto interrogativo dopo
string
indica che la proprietà è nullable. Per altre informazioni, vedere Tipi di riferimento Nullable.
L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.
Compilare il progetto per verificare che non siano presenti errori di compilazione.
Eseguire lo scaffolding del modello di filmato
In questa sezione viene eseguito lo scaffolding del modello *Movie*. Lo strumento di scaffolding crea quindi le pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello di filmato.
Creare la cartella Pages/Movies :
- Fare clic con il pulsante destro del mouse sulla cartella Pages Aggiungi>nuova cartella.>
- Assegnare alla cartella il nome Movies.
Fare clic con il pulsante destro del mouse sulla cartella> Pages/Movies Aggiungi>nuovo elemento con scaffolding.
Nella finestra di dialogo Aggiungi nuovo scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.
Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):
- Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
- Nella riga Classe contesto di dati selezionare il segno più +.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
RazorPagesMovie.Data.RazorPagesMovieContext
della classe. - Nell'elenco a discesa Provider di database selezionare SQL Server.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
- Selezionare Aggiungi.
Il appsettings.json
file viene aggiornato con il stringa di connessione utilizzato per connettersi a un database locale.
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.
File creati e aggiornati
Il processo di scaffolding crea i file seguenti:
- Pages/Movies: pagine Create (Crea), Delete (Elimina), Details (Dettagli), Edit (Modifica) e Index (Indice).
Data/RazorPagesMovieContext.cs
I file creati sono illustrati nell'esercitazione successiva.
Il processo di scaffolding aggiunge il codice evidenziato seguente al Program.cs
file:
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();
// 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.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Le Program.cs
modifiche vengono illustrate più avanti in questa esercitazione.
Creare lo schema del database iniziale usando la funzionalità di migrazione di Entity Framework
La funzionalità delle migrazioni in Entity Framework Core consente di:
- Creare lo schema del database iniziale.
- Aggiornare in modo incrementale lo schema del database per mantenerlo sincronizzato con il modello di dati dell'app. I dati esistenti nel database sono mantenuti.
In questa sezione viene usata la finestra Gestione pacchetti Console (PMC) per:
- Aggiungere una migrazione iniziale.
- Aggiornare il database con la migrazione iniziale.
Nel menu Strumenti selezionare Gestione pacchetti NuGet>Console di Gestione pacchetti.
Nella Console di Gestione pacchetti immettere i comandi seguenti:
Add-Migration InitialCreate Update-Database
Il comando
Add-Migration
genera un codice per creare lo schema del database iniziale. Lo schema si basa sul modello specificato inDbContext
. L'argomentoInitialCreate
viene usato per denominare la migrazione. È possibile usare qualsiasi nome, ma per convenzione viene selezionato un nome che descrive la migrazione.Il
Update-Database
comando esegue ilUp
metodo nelle migrazioni che non sono state applicate. In questo caso, il comando esegue ilUp
metodo nelMigrations/<time-stamp>_InitialCreate.cs
file , che crea il database.
Viene visualizzato l'avviso seguente, risolto in un passaggio successivo:
No type was specified for the decimal column 'Price' on entity type 'Movie'. (Nessun tipo specificato per la colonna decimale 'Price' nel tipo di entità 'Movie'). This will cause values to be silently truncated if they do not fit in the default precision and scale. (I valori saranno quindi automaticamente troncati se non rispettano la precisione e la scala predefinite). Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'. (Specificare in modo esplicito il tipo di colonna di SQL Server che può supportare tutti i valori usando 'HasColumnType()').
Contesto dati RazorPagesMovieContext
:
- Deriva da Microsoft.EntityFrameworkCore.DbContext.
- Specifica le entità incluse nel modello di dati.
- Coordina la EF Core funzionalità, ad esempio Crea, Lettura, Aggiorna ed Elimina, per il
Movie
modello.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
}
}
Il codice precedente crea una proprietà DbSet<Movie> per il set di entità. Nella terminologia di Entity Framework, un set di entità corrisponde in genere alla tabella di un database. Un'entità corrisponde a una riga nella tabella.
Il nome della stringa di connessione viene passato al contesto chiamando un metodo in un oggetto DbContextOptions. Per lo sviluppo locale, il sistema di configurazione legge il stringa di connessione dal appsettings.json
file.
Testare l'app
Eseguire l'app e accodare
/Movies
all'URL nel browser (http://localhost:port/movies
).Se si riceve un messaggio di errore che indica che
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Non è stato eseguita la migrazione.
Testare il collegamento Crea nuovo .
Nota
Potrebbe non essere possibile immettere virgole decimali nel campo
Price
. Per supportare la convalida jQuery per impostazioni locali diverse dall'inglese che usano la virgola (",") come separatore decimale e per formati di data diversi da quello dell'inglese (Stati Uniti), è necessario localizzare l'app. Per istruzioni sulla localizzazione, vedere questo problema su GitHub.Testare i collegamenti Modifica, Dettagli ed Elimina.
L'esercitazione successiva illustra i file creati tramite scaffolding.
Esaminare il contesto registrato con l'inserimento di dipendenze
ASP.NET Core viene compilato con l'inserimento di dipendenze. I servizi, ad esempio il contesto del database, vengono registrati con inserimento delle dipendenze durante l'avvio EF Core dell'applicazione. I componenti che richiedono questi servizi (ad esempio Razor Pages) vengono forniti tramite parametri del costruttore. Più avanti nell'esercitazione viene illustrato il codice del costruttore che ottiene un'istanza del contesto di database.
Lo strumento di scaffolding ha creato automaticamente un contesto di database e lo ha registrato con il contenitore di inserimento delle dipendenze. Il codice evidenziato seguente viene aggiunto al Program.cs
file dallo scaffolder:
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();
// 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.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Risoluzione dei problemi con l'esempio completato
Se si verifica un problema che non è possibile risolvere, confrontare il codice con il progetto completato. Visualizzare o scaricare il progetto completato (come scaricare).
Passaggi successivi
In questa esercitazione vengono aggiunte classi per la gestione dei film in un database. Le classi di modello dell'app usano Entity Framework Core (EF Core) per lavorare con il database. EF Core è un mapper relazionale a oggetti (O/RM) che semplifica l'accesso ai dati. Per prima cosa si scrivono le classi del modello e EF Core si crea il database.
Le classi del modello sono note come classi POCO (da "Plain-O ld CLR Objects") perché non hanno una dipendenza da EF Core. Definiscono le proprietà dei dati archiviati nel database.
Aggiungere un modello di dati
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto> RazorPagesMovie Aggiungi>nuova cartella. Denominare la cartella
Models
.Fare clic con il pulsante destro del mouse sulla
Models
cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.Aggiungere le proprietà seguenti alla classe
Movie
:using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models { public class Movie { public int ID { get; set; } public string Title { get; set; } = string.Empty; [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } = string.Empty; public decimal Price { get; set; } } }
La classe Movie
contiene:
Il campo
ID
è richiesto dal database per la chiave primaria.Attributo [DataType] che specifica il tipo di dati nella
ReleaseDate
proprietà . Con questo attributo:- L'utente non deve immettere le informazioni sull'ora nel campo data.
- Viene visualizzata solo la data, non le informazioni temporali.
L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.
Compilare il progetto per verificare che non siano presenti errori di compilazione.
Eseguire lo scaffolding del modello di filmato
In questa sezione viene eseguito lo scaffolding del modello *Movie*. Lo strumento di scaffolding crea quindi le pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello di filmato.
Aggiungere il pacchetto
Microsoft.EntityFrameworkCore.Design
NuGet , necessario per lo strumento di scaffolding.- Dal menu Strumenti selezionare NuGet Gestione pacchetti> Gestisci pacchetti NuGet per la soluzione
- Selezionare la scheda Sfoglia.
- Immettere
Microsoft.EntityFrameworkCore.Design
e selezionarlo dall'elenco. - Selezionare Progetto e quindi Selezionare Installa
- Selezionare Accetto nella finestra di dialogo Accettazione della licenza.
Creare la cartella Pages/Movies :
- Fare clic con il pulsante destro del mouse sulla cartella Pages Aggiungi>nuova cartella.>
- Assegnare alla cartella il nome Movies.
Fare clic con il pulsante destro del mouse sulla cartella> Pages/Movies Aggiungi>nuovo elemento con scaffolding.
Nella finestra di dialogo Aggiungi nuovo scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.
Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):
- Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
- Nella riga Classe contesto di dati selezionare il segno più +.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
RazorPagesMovie.Data.RazorPagesMovieContext
della classe.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
- Selezionare Aggiungi.
Se viene visualizzato un messaggio di errore che indica che è necessario installare il
Microsoft.EntityFrameworkCore.SqlServer
pacchetto, ripetere i passaggi che iniziano con Add New Scaffolded Item (Aggiungi>nuovo elemento con scaffolding).
Il appsettings.json
file viene aggiornato con il stringa di connessione utilizzato per connettersi a un database locale.
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.
File creati e aggiornati
Il processo di scaffolding crea i file seguenti:
- Pages/Movies: pagine Create (Crea), Delete (Elimina), Details (Dettagli), Edit (Modifica) e Index (Indice).
Data/RazorPagesMovieContext.cs
I file creati sono illustrati nell'esercitazione successiva.
Il processo di scaffolding aggiunge il codice evidenziato seguente al Program.cs
file:
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();
// 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.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Le Program.cs
modifiche vengono illustrate più avanti in questa esercitazione.
Creare lo schema del database iniziale usando la funzionalità di migrazione di Entity Framework
La funzionalità delle migrazioni in Entity Framework Core consente di:
- Creare lo schema del database iniziale.
- Aggiornare in modo incrementale lo schema del database per mantenerlo sincronizzato con il modello di dati dell'app. I dati esistenti nel database sono mantenuti.
In questa sezione viene usata la finestra Gestione pacchetti Console (PMC) per:
- Aggiungere una migrazione iniziale.
- Aggiornare il database con la migrazione iniziale.
Nel menu Strumenti selezionare Gestione pacchetti NuGet>Console di Gestione pacchetti.
Nella Console di Gestione pacchetti immettere i comandi seguenti:
Add-Migration InitialCreate Update-Database
I comandi precedenti installano gli strumenti di Entity Framework Core ed eseguono il migrations
comando per generare codice che crea lo schema del database iniziale.
Viene visualizzato l'avviso seguente, risolto in un passaggio successivo:
No type was specified for the decimal column 'Price' on entity type 'Movie'. (Nessun tipo specificato per la colonna decimale 'Price' nel tipo di entità 'Movie'). This will cause values to be silently truncated if they do not fit in the default precision and scale. (I valori saranno quindi automaticamente troncati se non rispettano la precisione e la scala predefinite). Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'. (Specificare in modo esplicito il tipo di colonna di SQL Server che può supportare tutti i valori usando 'HasColumnType()').
Il comando migrations
genera un codice per creare lo schema del database iniziale. Lo schema si basa sul modello specificato in DbContext
. L'argomento InitialCreate
viene usato per denominare le migrazioni. È possibile usare qualsiasi nome, ma per convenzione viene selezionato un nome che descrive la migrazione.
Il update
comando esegue il Up
metodo nelle migrazioni che non sono state applicate. In questo caso, update
esegue il Up
metodo nel Migrations/<time-stamp>_InitialCreate.cs
file , che crea il database.
Esaminare il contesto registrato con l'inserimento di dipendenze
ASP.NET Core viene compilato con l'inserimento di dipendenze. I servizi, ad esempio il contesto del database, vengono registrati con inserimento delle dipendenze durante l'avvio EF Core dell'applicazione. I componenti che richiedono questi servizi (ad esempio Razor Pages) vengono forniti tramite parametri del costruttore. Più avanti nell'esercitazione viene illustrato il codice del costruttore che ottiene un'istanza del contesto di database.
Lo strumento di scaffolding ha creato automaticamente un contesto di database e lo ha registrato con il contenitore di inserimento delle dipendenze. Il codice evidenziato seguente viene aggiunto al Program.cs
file dallo scaffolder:
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();
// 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.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Contesto dati RazorPagesMovieContext
:
- Deriva da Microsoft.EntityFrameworkCore.DbContext.
- Specifica le entità incluse nel modello di dati.
- Coordina la EF Core funzionalità, ad esempio Crea, Lettura, Aggiorna ed Elimina, per il
Movie
modello.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
}
}
Il codice precedente crea una proprietà DbSet<Movie> per il set di entità. Nella terminologia di Entity Framework, un set di entità corrisponde in genere alla tabella di un database. Un'entità corrisponde a una riga nella tabella.
Il nome della stringa di connessione viene passato al contesto chiamando un metodo in un oggetto DbContextOptions. Per lo sviluppo locale, il sistema di configurazione legge il stringa di connessione dal appsettings.json
file.
Testare l'app
Eseguire l'app e accodare
/Movies
all'URL nel browser (http://localhost:port/movies
).Se si riceve un messaggio di errore che indica che
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Non è stato eseguita la migrazione.
Testare il collegamento Crea nuovo .
Nota
Potrebbe non essere possibile immettere virgole decimali nel campo
Price
. Per supportare la convalida jQuery per impostazioni locali diverse dall'inglese che usano la virgola (",") come separatore decimale e per formati di data diversi da quello dell'inglese (Stati Uniti), è necessario localizzare l'app. Per istruzioni sulla localizzazione, vedere questo problema su GitHub.Testare i collegamenti Modifica, Dettagli ed Elimina.
L'esercitazione successiva illustra i file creati tramite scaffolding.
Risoluzione dei problemi con l'esempio completato
Se si verifica un problema che non è possibile risolvere, confrontare il codice con il progetto completato. Visualizzare o scaricare il progetto completato (come scaricare).
Passaggi successivi
In questa sezione si aggiungono alcune classi per la gestione di filmati in un database. Le classi di modello dell'app usano Entity Framework Core (EF Core) per lavorare con il database. EF Core è un mapper relazionale a oggetti (O/RM) che semplifica l'accesso ai dati. Per prima cosa si scrivono le classi del modello e EF Core si crea il database.
Le classi del modello sono note come classi POCO (da "Plain-O ld CLR Objects") perché non hanno una dipendenza da EF Core. Definiscono le proprietà dei dati archiviati nel database.
Visualizzare o scaricare il codice di esempio (procedura per il download).
Aggiungere un modello di dati
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto> RazorPagesMovie Aggiungi>nuova cartella. Denominare la cartella
Models
.Fare clic con il pulsante destro del mouse sulla
Models
cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.Aggiungere le proprietà seguenti alla classe
Movie
:using System; using System.ComponentModel.DataAnnotations; namespace RazorPagesMovie.Models { public class Movie { public int ID { get; set; } public string Title { get; set; } [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } } }
La classe Movie
contiene:
Il campo
ID
è richiesto dal database per la chiave primaria.[DataType(DataType.Date)]
: l'attributo [DataType] specifica il tipo di dati (Date
). Con questo attributo:- L'utente non deve immettere le informazioni sull'ora nel campo data.
- Viene visualizzata solo la data, non le informazioni temporali.
L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.
Compilare il progetto per verificare che non siano presenti errori di compilazione.
Eseguire lo scaffolding del modello di filmato
In questa sezione viene eseguito lo scaffolding del modello *Movie*. Lo strumento di scaffolding crea quindi le pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello di filmato.
Creare una cartella Pages/Movies:
- Fare clic con il pulsante destro del mouse sulla cartella Pages Aggiungi>nuova cartella.>
- Assegnare alla cartella il nome Movies.
Fare clic con il pulsante destro del mouse sulla cartella> Pages/Movies Aggiungi>nuovo elemento con scaffolding.
Nella finestra di dialogo Aggiungi scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.
Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):
- Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
- Nella riga Classe contesto di dati selezionare il segno più +.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
RazorPagesMovie.Data.RazorPagesMovieContext
della classe.
- Nella finestra di dialogo Aggiungi contesto dati viene generato il nome
- Selezionare Aggiungi.
Il appsettings.json
file viene aggiornato con il stringa di connessione utilizzato per connettersi a un database locale.
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.
File creati e aggiornati
Il processo di scaffolding crea i file seguenti:
- Pages/Movies: pagine Create (Crea), Delete (Elimina), Details (Dettagli), Edit (Modifica) e Index (Indice).
Data/RazorPagesMovieContext.cs
File aggiornati
Startup.cs
I file creati e aggiornati sono illustrati nella sezione successiva.
Creare lo schema del database iniziale usando la funzionalità di migrazione di Entity Framework
La funzionalità delle migrazioni in Entity Framework Core consente di:
- Creare lo schema del database iniziale.
- Aggiornare in modo incrementale lo schema del database per mantenerlo sincronizzato con il modello di dati dell'applicazione. I dati esistenti nel database sono mantenuti.
In questa sezione viene usata la finestra Gestione pacchetti Console (PMC) per:
- Aggiungere una migrazione iniziale.
- Aggiornare il database con la migrazione iniziale.
Nel menu Strumenti selezionare Gestione pacchetti NuGet>Console di Gestione pacchetti.
Nella Console di Gestione pacchetti immettere i comandi seguenti:
Add-Migration InitialCreate Update-Database
Per SQL Server, i comandi precedenti generano l'avviso seguente: "Nessun tipo è stato specificato per la colonna decimale 'Price' nel tipo di entità 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. (I valori saranno quindi automaticamente troncati se non rispettano la precisione e la scala predefinite). Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'. (Specificare in modo esplicito il tipo di colonna di SQL Server che può supportare tutti i valori usando 'HasColumnType()')"
Ignorare l'avviso, perché verrà risolto in un passaggio successivo.
Il comando migrations
genera un codice per creare lo schema del database iniziale. Lo schema si basa sul modello specificato in DbContext
. L'argomento InitialCreate
viene usato per denominare le migrazioni. È possibile usare qualsiasi nome, ma per convenzione viene selezionato un nome che descrive la migrazione.
Il update
comando esegue il Up
metodo nelle migrazioni che non sono state applicate. In questo caso, update
esegue il Up
metodo nel Migrations/<time-stamp>_InitialCreate.cs
file , che crea il database.
Esaminare il contesto registrato con l'inserimento di dipendenze
ASP.NET Core viene compilato con l'inserimento di dipendenze. I servizi, ad esempio il contesto del database, vengono registrati con inserimento delle dipendenze durante l'avvio EF Core dell'applicazione. I componenti che richiedono questi servizi (ad esempio Razor Pages) vengono forniti tramite parametri del costruttore. Più avanti nell'esercitazione viene illustrato il codice del costruttore che ottiene un'istanza del contesto di database.
Lo strumento di scaffolding ha creato automaticamente un contesto di database e lo ha registrato con il contenitore di inserimento delle dipendenze.
Esaminare il metodo Startup.ConfigureServices
. La riga evidenziata è stata aggiunta dallo scaffolder:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
La RazorPagesMovieContext
funzionalità delle EF Core coordinate, ad esempio Create, Read, Update e Delete, per il Movie
modello. Il contesto dei dati (RazorPagesMovieContext
) è derivato da Microsoft.EntityFrameworkCore.DbContext. Il contesto dei dati specifica le entità incluse nel modello di dati.
using Microsoft.EntityFrameworkCore;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (
DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
}
}
Il codice precedente crea una proprietà DbSet<Movie> per il set di entità. Nella terminologia di Entity Framework, un set di entità corrisponde in genere alla tabella di un database. Un'entità corrisponde a una riga nella tabella.
Il nome della stringa di connessione viene passato al contesto chiamando un metodo in un oggetto DbContextOptions. Per lo sviluppo locale, il sistema di configurazione legge il stringa di connessione dal appsettings.json
file.
Testare l'app
Eseguire l'app e accodare
/Movies
all'URL nel browser (http://localhost:port/movies
).Se si riceve un messaggio di errore che indica che
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed. Login failed for user 'User-name'.
Non è stato eseguita la migrazione.
Eseguire il test del collegamento Crea.
Nota
Potrebbe non essere possibile immettere virgole decimali nel campo
Price
. Per supportare la convalida jQuery per impostazioni locali diverse dall'inglese che usano la virgola (",") come separatore decimale e per formati di data diversi da quello dell'inglese (Stati Uniti), è necessario localizzare l'app. Per istruzioni sulla localizzazione, vedere questo problema su GitHub.Testare i collegamenti Modifica, Dettagli ed Elimina.
Registrazione SQL di Entity Framework Core
La configurazione di registrazione viene comunemente fornita dalla sezione Logging
dei file appsettings.{Environment}.json
. Per registrare istruzioni SQL, aggiungere "Microsoft.EntityFrameworkCore.Database.Command": "Information"
al appsettings.Development.json
file:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
}
},
"AllowedHosts": "*"
}
Con il codice JSON precedente, le istruzioni SQL vengono visualizzate nella riga di comando e nella finestra di output di Visual Studio.
Per altre informazioni, vedere Registrazione in .NET Core e ASP.NET Core e questo problema di GitHub.
L'esercitazione successiva illustra i file creati tramite scaffolding.
Passaggi successivi
In questa sezione vengono aggiunte classi per la gestione dei film. Le classi di modello dell'app usano Entity Framework Core (EF Core) per lavorare con il database. EF Core è un mapper relazionale a oggetti (O/RM) che semplifica l'accesso ai dati.
Le classi del modello sono note come classi POCO (da "oggetti CLR semplici") perché non hanno alcuna dipendenza da EF Core. Definiscono le proprietà dei dati archiviati nel database.
Visualizzare o scaricare il codice di esempio (procedura per il download).
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.
Aggiungere un modello di dati
Fare clic con il pulsante destro del mouse sul progetto >RazorPagesMovie Aggiungi>nuova cartella. Denominare la cartella Models
.
Fare clic con il pulsante destro del mouse sulla Models
cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.
Aggiungere le proprietà seguenti alla classe Movie
:
using System;
using System.ComponentModel.DataAnnotations;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
La classe Movie
contiene:
Il campo
ID
è richiesto dal database per la chiave primaria.[DataType(DataType.Date)]
: l'attributo DataType specifica il tipo di dati (Date
). Con questo attributo:- l'utente non deve immettere le informazioni temporali nel campo della data.
- Viene visualizzata solo la data, non le informazioni temporali.
L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.
L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.
Compilare il progetto per verificare che non siano presenti errori di compilazione.
Eseguire lo scaffolding del modello di filmato
In questa sezione viene eseguito lo scaffolding del modello *Movie*. Lo strumento di scaffolding crea quindi le pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello di filmato.
Creare una cartella Pages/Movies:
- Fare clic con il pulsante destro del mouse sulla cartella Pages Aggiungi>nuova cartella.>
- Assegnare alla cartella il nome Movies.
Fare clic con il pulsante destro del mouse sulla cartella> Pages/Movies Aggiungi>nuovo elemento con scaffolding.
Nella finestra di dialogo Aggiungi scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.
Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):
- Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
- Nella riga Classe contesto dati selezionare il + segno (più) e modificare il nome generato da RazorPagesMovie.
Models
. RazorPagesMovieContext in RazorPagesMovie.Dati. RazorPagesMovieContext. Questa modifica non è obbligatoria. Crea la classe del contesto di database con lo spazio dei nomi corretto. - Selezionare Aggiungi.
Il appsettings.json
file viene aggiornato con il stringa di connessione utilizzato per connettersi a un database locale.
File creati
Il processo di scaffolding crea e aggiorna i file seguenti:
- Pages/Movies: pagine Create (Crea), Delete (Elimina), Details (Dettagli), Edit (Modifica) e Index (Indice).
Data/RazorPagesMovieContext.cs
Aggiornato
Startup.cs
I file creati e aggiornati sono illustrati nella sezione successiva.
Migrazione iniziale
In questa sezione viene usata la Console di Gestione pacchetti (PMC) per:
- Aggiungere una migrazione iniziale.
- Aggiornare il database con la migrazione iniziale.
Nel menu Strumenti selezionare Gestione pacchetti NuGet>Console di Gestione pacchetti.
Nella Console di Gestione pacchetti immettere i comandi seguenti:
Add-Migration InitialCreate
Update-Database
I comandi precedenti generano l'avviso seguente: "Nessun tipo è stato specificato per la colonna decimale 'Price' nel tipo di entità 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. (I valori saranno quindi automaticamente troncati se non rispettano la precisione e la scala predefinite). Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'. (Specificare in modo esplicito il tipo di colonna di SQL Server che può supportare tutti i valori usando 'HasColumnType()')"
Ignorare l'avviso, perché verrà risolto in un passaggio successivo.
Il comando migrations genera codice per creare lo schema iniziale del database. Lo schema si basa sul modello specificato in DbContext
. L'argomento InitialCreate
viene usato per denominare le migrazioni. È possibile usare qualsiasi nome, ma per convenzione viene selezionato un nome che descrive la migrazione.
Il update
comando esegue il Up
metodo nelle migrazioni che non sono state applicate. In questo caso, update
esegue il Up
metodo nel Migrations/<time-stamp>_InitialCreate.cs
file , che crea il database.
Esaminare il contesto registrato con l'inserimento di dipendenze
ASP.NET Core viene compilato con l'inserimento di dipendenze. I servizi, ad esempio il contesto del database, vengono registrati con inserimento delle dipendenze durante l'avvio EF Core dell'applicazione. I componenti che richiedono questi servizi, ad esempio Razor Pages, vengono forniti tramite parametri del costruttore. Più avanti nell'esercitazione viene illustrato il codice del costruttore che ottiene un'istanza del contesto di database.
Lo strumento di scaffolding ha creato automaticamente un contesto di database e lo ha registrato con il contenitore di inserimento delle dipendenze.
Esaminare il metodo Startup.ConfigureServices
. La riga evidenziata è stata aggiunta dallo scaffolder:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
La RazorPagesMovieContext
funzionalità delle EF Core coordinate, ad esempio Create, Read, Update e Delete, per il Movie
modello. Il contesto dei dati (RazorPagesMovieContext
) è derivato da Microsoft.EntityFrameworkCore.DbContext. Il contesto dei dati specifica le entità incluse nel modello di dati.
using Microsoft.EntityFrameworkCore;
namespace RazorPagesMovie.Data
{
public class RazorPagesMovieContext : DbContext
{
public RazorPagesMovieContext (
DbContextOptions<RazorPagesMovieContext> options)
: base(options)
{
}
public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
}
}
Il codice precedente crea una proprietà DbSet<Movie> per il set di entità. Nella terminologia di Entity Framework, un set di entità corrisponde in genere alla tabella di un database. Un'entità corrisponde a una riga nella tabella.
Il nome della stringa di connessione viene passato al contesto chiamando un metodo in un oggetto DbContextOptions. Per lo sviluppo locale, il sistema di configurazione legge il stringa di connessione dal appsettings.json
file.
Testare l'app
- Eseguire l'app e accodare
/Movies
all'URL nel browser (http://localhost:port/movies
).
Se si riceve l'errore:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
Non è stato eseguita la migrazione.
Eseguire il test del collegamento Crea.
Nota
Potrebbe non essere possibile immettere virgole decimali nel campo
Price
. Per supportare la convalida jQuery per impostazioni locali diverse dall'inglese che usano la virgola (",") come separatore decimale e per formati di data diversi da quello dell'inglese (Stati Uniti), è necessario localizzare l'app. Per istruzioni sulla localizzazione, vedere questo problema su GitHub.Testare i collegamenti Modifica, Dettagli ed Elimina.
L'esercitazione successiva illustra i file creati tramite scaffolding.