Parte 2, aggiungere un modello a un'app Razor Pages in ASP.NET Core

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.

In questa esercitazione si aggiungono 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-Old CLR Objects") perché non dipendono da EF Core. Definiscono le proprietà dei dati archiviati nel database.

Aggiungere un modello di dati

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto RazorPagesMovie . Selezionare Aggiungi>Nuova cartella. Denominare la cartella Models.

  2. Fare clic con il pulsante destro del mouse sulla Models cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.

  3. 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à . Usando questo attributo:

    • L'utente non deve immettere le informazioni sull'ora nel campo data.
    • Viene visualizzata solo la data, senza informazioni sull'ora.
  • Un punto interrogativo dopo string indica che la proprietà è nullable. Per ulteriori informazioni, vedere tipi 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 si esegue lo scaffolding del modello di film. Lo strumento di scaffolding genera pagine per le operazioni di Crea, Leggi, Aggiorna ed Elimina (CRUD) del modello di film.

  1. Creare la cartella Pages/Movies :

    1. Fare clic con il pulsante destro del mouse sulla cartella Pages>Aggiungi>Nuova cartella.
    2. Assegnare alla cartella il nome Movies.
  2. Fare clic con il pulsante destro del mouse sulla cartella Pages/Movies>Aggiungi>Nuovo elemento con scaffolding.

Nuovo elemento strutturato.

  1. Nella finestra di dialogo Aggiungi nuovo scaffolding, selezionare RazorPagine che usano Entity Framework (CRUD)>Aggiungi.

Aggiungi Scaffold.

  1. Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):

    1. Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
    2. Nella riga Classe contesto di dati selezionare il segno più +.
      1. Nella finestra di dialogo Aggiungi contesto dati viene generato il nome RazorPagesMovie.Data.RazorPagesMovieContext della classe.
      2. Nell'elenco a discesa Provider di database, seleziona SQL Server.
    3. Seleziona Aggiungi.

    Aggiungere Razor pagine.

Il file appsettings.json viene aggiornato con la stringa di connessione utilizzata per connettersi a un database locale.

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 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

La prossima esercitazione spiega i file creati.

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

app.Run();

Più avanti in questa esercitazione verranno fornite informazioni sulle Program.cs modifiche.

Creare lo schema iniziale del database 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. Questo approccio mantiene i dati esistenti nel database.

In questa sezione usare la finestra 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.

    Menu PMC.

  • 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 in DbContext. L'argomento InitialCreate identifica la migrazione. È possibile usare qualsiasi nome, ma per convenzione scegliere un nome che descrive la migrazione.

Viene visualizzato l'avviso seguente, che verrà gestito in un passaggio successivo.

Non è stato specificato alcun tipo di archiviazione per la colonna di tipo decimale 'Price' nel tipo di entità 'Movie'. Questa condizione fa sì che i valori vengano troncati automaticamente se non rientrano nella precisione e nella scala predefinita. Specificare in modo esplicito il tipo di colonna di SQL Server che può contenere tutti i valori in 'OnModelCreating' usando 'HasColumnType', specificare precisione e scala usando 'HasPrecision' o configurare un convertitore di valori usando 'HasConversion'.

  • In PMC immettere il comando seguente:

    Update-Database
    

    Il Update-Database comando esegue il Up metodo nelle migrazioni non applicate. In questo caso, il comando esegue il Up metodo nel Migrations/<time-stamp>_InitialCreate.cs file , che crea il database.

Il contesto dei dati RazorPagesMovieContext:

  • Deriva da Microsoft.EntityFrameworkCore.DbContext.
  • Specifica le entità incluse nel modello di dati.
  • Coordina la EF Core funzionalità, ad esempio Crea, Lettura, Aggiornamento ed Elimina, per il Movie modello.

Classe RazorPagesMovieContext nel file Data/RazorPagesMovieContext.csgenerato :

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 su un oggetto DbContextOptions . Per lo sviluppo locale, il sistema di configurazione legge la stringa di connessione dal file appsettings.json.

Testare l'app

  1. Eseguire l'app e accodare /Movies all'URL nel browser (http://localhost:port/movies).

    Se viene visualizzato il seguente errore:

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

    Hai saltato il passaggio delle migrazioni.

  2. Testa il link Create New.

Crea pagina.

Note

Potrebbe non essere possibile immettere virgole decimali nel Price campo. 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.

  1. Testare i collegamenti Modifica, Dettagli ed Elimina.

Il tutorial successivo spiega i file generati dallo scaffolding.

Esaminare il contesto registrato con l'iniezione delle dipendenze

ASP.NET Core si basa sulla dependency injection. Registrare i servizi, ad esempio il contesto del database, con inserimento delle dipendenze durante l'avvio EF Core dell'applicazione. Fornire componenti che richiedono questi servizi (ad esempio Razor Pages) 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 crea automaticamente un contesto di database e lo registra 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()
   .WithStaticAssets();

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-Old CLR Objects") perché non dipendono da EF Core. Definiscono le proprietà dei dati archiviati nel database.

Aggiungere un modello di dati

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto RazorPagesMovie>Aggiungi>Nuova cartella. Denominare la cartella Models.

  2. Fare clic con il pulsante destro del mouse sulla Models cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.

  3. 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 ulteriori informazioni, vedere tipi riferimento nullable.

L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.

Compilare il progetto per verificare che non siano presenti errori di compilazione.

Creare la struttura di base del modello Film

In questa sezione viene eseguito lo scaffolding del modello *Movie*. Vale a dire, lo strumento di scaffolding genera pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello film.

  1. Creare la cartella Pages/Movies :

    1. Fare clic con il pulsante destro del mouse sulla cartella Pages>Aggiungi>Nuova cartella.
    2. Assegnare alla cartella il nome Movies.
  2. Fare clic con il pulsante destro del mouse sulla cartella Pages/Movies>Aggiungi>Nuovo elemento con scaffolding.

    Nuovo elemento guidato

  3. Nella finestra di dialogo Aggiungi nuovo scaffolding, selezionare RazorPagine che usano Entity Framework (CRUD)>Aggiungi.

    Aggiungi scaffold

  4. Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):

    1. Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
    2. Nella riga Classe contesto di dati selezionare il segno più +.
      1. Nella finestra di dialogo Aggiungi contesto dati viene generato il nome RazorPagesMovie.Data.RazorPagesMovieContext della classe.
      2. Nell'elenco a discesa Provider di database, seleziona SQL Server.
    3. Seleziona Aggiungi.

    Aggiungi Razor pagine

Il file appsettings.json viene aggiornato con la stringa di connessione utilizzata per connettersi a un database locale.

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 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.

    Menu PMC

  • 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 in DbContext. L'argomento InitialCreate 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'). Ciò comporterà che i valori vengano troncati senza alcuna segnalazione se non rientrano nella precisione e nella 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 il Up metodo nelle migrazioni che non sono state applicate. In questo caso, il comando esegue il Up metodo nel Migrations/<time-stamp>_InitialCreate.cs file , che crea il database.

Il contesto dei 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.csgenerato :

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 la stringa di connessione dal file appsettings.json.

Testare l'app

  1. Eseguire l'app e accodare /Movies all'URL nel browser (http://localhost:port/movies).

    Se viene visualizzato il seguente errore:

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

    Hai saltato il passaggio delle migrazioni.

  2. Testa il link Create New.

    Crea pagina

    Note

    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.

  3. Testare i collegamenti Modifica, Dettagli ed Elimina.

Il tutorial successivo spiega i file generati dallo scaffolding.

Esaminare il contesto registrato con l'iniezione delle dipendenze

ASP.NET Core si basa sulla dependency injection. 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 del database e lo ha registrato nel contenitore di dependency injection. 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-Old CLR Objects") perché non dipendono da EF Core. Definiscono le proprietà dei dati archiviati nel database.

Aggiungere un modello di dati

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto RazorPagesMovie>Aggiungi>Nuova cartella. Denominare la cartella Models.

  2. Fare clic con il pulsante destro del mouse sulla Models cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.

  3. 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 ulteriori informazioni, vedere tipi riferimento nullable.

L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.

Compilare il progetto per verificare che non siano presenti errori di compilazione.

Creare la struttura di base del modello Film

In questa sezione viene eseguito lo scaffolding del modello *Movie*. Vale a dire, lo strumento di scaffolding genera pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello film.

  1. Creare la cartella Pages/Movies :

    1. Fare clic con il pulsante destro del mouse sulla cartella Pages>Aggiungi>Nuova cartella.
    2. Assegnare alla cartella il nome Movies.
  2. Fare clic con il pulsante destro del mouse sulla cartella Pages/Movies>Aggiungi>Nuovo elemento con scaffolding.

    Nuovo elemento guidato

  3. Nella finestra di dialogo Aggiungi nuovo scaffolding, selezionare RazorPagine che usano Entity Framework (CRUD)>Aggiungi.

    Aggiungi scaffold

  4. Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):

    1. Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
    2. Nella riga Classe contesto di dati selezionare il segno più +.
      1. Nella finestra di dialogo Aggiungi contesto dati viene generato il nome RazorPagesMovie.Data.RazorPagesMovieContext della classe.
      2. Nell'elenco a discesa Provider di database, seleziona SQL Server.
    3. Seleziona Aggiungi.

    Aggiungi Razor pagine

Il file appsettings.json viene aggiornato con la stringa di connessione utilizzata per connettersi a un database locale.

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 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.

    Menu PMC

  • 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 in DbContext. L'argomento InitialCreate 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'). Ciò comporterà che i valori vengano troncati senza alcuna segnalazione se non rientrano nella precisione e nella 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 il Up metodo nelle migrazioni che non sono state applicate. In questo caso, il comando esegue il Up metodo nel Migrations/<time-stamp>_InitialCreate.cs file , che crea il database.

Il contesto dei 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 la stringa di connessione dal file appsettings.json.

Testare l'app

  1. Eseguire l'app e accodare /Movies all'URL nel browser (http://localhost:port/movies).

    Se viene visualizzato il seguente errore:

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

    Hai saltato il passaggio delle migrazioni.

  2. Testa il link Create New.

    Crea pagina

    Note

    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.

  3. Testare i collegamenti Modifica, Dettagli ed Elimina.

Il tutorial successivo spiega i file generati dallo scaffolding.

Esaminare il contesto registrato con l'iniezione delle dipendenze

ASP.NET Core si basa sulla dependency injection. 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 del database e lo ha registrato nel contenitore di dependency injection. 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-Old CLR Objects") perché non dipendono da EF Core. Definiscono le proprietà dei dati archiviati nel database.

Aggiungere un modello di dati

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto RazorPagesMovie>Aggiungi>Nuova cartella. Denominare la cartella Models.

  2. Fare clic con il pulsante destro del mouse sulla Models cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.

  3. 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 riferimento nullable.

L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.

Compilare il progetto per verificare che non siano presenti errori di compilazione.

Creare la struttura di base del modello Film

In questa sezione viene eseguito lo scaffolding del modello *Movie*. Vale a dire, lo strumento di scaffolding genera pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello film.

  1. Creare la cartella Pages/Movies :

    1. Fare clic con il pulsante destro del mouse sulla cartella Pages>Aggiungi>Nuova cartella.
    2. Assegnare alla cartella il nome Movies.
  2. Fare clic con il pulsante destro del mouse sulla cartella Pages/Movies>Aggiungi>Nuovo elemento con scaffolding.

    Nuovo elemento guidato

  3. Nella finestra di dialogo Aggiungi nuovo scaffolding, selezionare RazorPagine che usano Entity Framework (CRUD)>Aggiungi.

    Aggiungi scaffold

  4. Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):

    1. Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
    2. Nella riga Classe contesto di dati selezionare il segno più +.
      1. Nella finestra di dialogo Aggiungi contesto dati viene generato il nome RazorPagesMovie.Data.RazorPagesMovieContext della classe.
      2. Nell'elenco a discesa Provider di database, seleziona SQL Server.
    3. Seleziona Aggiungi.

    Aggiungi Razor pagine

Il file appsettings.json viene aggiornato con la stringa di connessione utilizzata per connettersi a un database locale.

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 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.
  1. Nel menu Strumenti selezionare Gestione pacchetti NuGet>Console di Gestione pacchetti.

    Menu PMC

  2. Nella PMC, 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 in DbContext. L'argomento InitialCreate 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 il Up metodo nelle migrazioni che non sono state applicate. In questo caso, il comando esegue il Up metodo nel Migrations/<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'). Ciò comporterà che i valori vengano troncati senza alcuna segnalazione se non rientrano nella precisione e nella 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 contesto dei 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 la stringa di connessione dal file appsettings.json.

Testare l'app

  1. Eseguire l'app e accodare /Movies all'URL nel browser (http://localhost:port/movies).

    Se viene visualizzato il seguente errore:

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

    Hai saltato il passaggio delle migrazioni.

  2. Testa il link Create New.

    Crea pagina

    Note

    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.

  3. Testare i collegamenti Modifica, Dettagli ed Elimina.

Il tutorial successivo spiega i file generati dallo scaffolding.

Esaminare il contesto registrato con l'iniezione delle dipendenze

ASP.NET Core si basa sulla dependency injection. 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 del database e lo ha registrato nel contenitore di dependency injection. 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-Old CLR Objects") perché non dipendono da EF Core. Definiscono le proprietà dei dati archiviati nel database.

Aggiungere un modello di dati

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto RazorPagesMovie>Aggiungi>Nuova cartella. Denominare la cartella Models.

  2. Fare clic con il pulsante destro del mouse sulla Models cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.

  3. 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 si esegue lo scaffolding del modello *Movie*. Vale a dire, lo strumento di scaffolding genera le pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello Movie.

  1. Aggiungere il pacchetto Microsoft.EntityFrameworkCore.DesignNuGet , necessario per lo strumento di scaffolding.

    1. Dal menu Strumenti selezionare NuGet Gestione pacchetti> Gestisci pacchetti NuGet per la soluzioneGestione pacchetti NuGet : gestire
    2. Selezionare la scheda Sfoglia.
    3. Immettere Microsoft.EntityFrameworkCore.Design e selezionarlo dall'elenco.
    4. Selezionare Progetto e quindi Selezionare Installa
    5. Selezionare Accetto nella finestra di dialogo Accettazione della licenza. Gestione pacchetti NuGet - Aggiungere un pacchetto
  2. Creare la cartella Pages/Movies :

    1. Fare clic con il pulsante destro del mouse sulla cartella Pages>Aggiungi>Nuova cartella.
    2. Assegnare alla cartella il nome Movies.
  3. Fare clic con il pulsante destro del mouse sulla cartella Pages/Movies>Aggiungi>Nuovo elemento con scaffolding.

    Nuovo elemento con supporto

  4. Nella finestra di dialogo Aggiungi nuovo scaffold, selezionare RazorPagine che usano Entity Framework (CRUD)>Aggiungi.

    Aggiungi scaffold

  5. Completare la finestra di dialogo Aggiungi pagine con Entity Framework (CRUD):Razor

    1. Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
    2. Nella riga Classe contesto di dati selezionare il segno più +.
      1. Nella finestra di dialogo Aggiungi contesto dati viene generato il nome RazorPagesMovie.Data.RazorPagesMovieContext della classe.
    3. Seleziona Aggiungi.

    Aggiungi Razor pagine

    Se viene visualizzato un messaggio di errore che indica che è necessario installare il pacchetto Microsoft.EntityFrameworkCore.SqlServer, ripeti i passaggi a partire da Add>New Scaffolded Item.

Il file appsettings.json viene aggiornato con la stringa di connessione utilizzata per connettersi a un database locale.

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 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.
  1. Nel menu Strumenti selezionare Gestione pacchetti NuGet>Console di Gestione pacchetti.

    Menu PMC

  2. Nella PMC, 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'). Ciò comporterà che i valori vengano troncati senza alcuna segnalazione se non rientrano nella precisione e nella 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'iniezione delle dipendenze

ASP.NET Core si basa sulla dependency injection. 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 del database e lo ha registrato nel contenitore di dependency injection. 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();

Il contesto dei 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 la stringa di connessione dal file appsettings.json.

Testare l'app

  1. Eseguire l'app e accodare /Movies all'URL nel browser (http://localhost:port/movies).

    Se viene visualizzato il seguente errore:

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

    Hai saltato il passaggio delle migrazioni.

  2. Testa il link Create New.

    Crea pagina

    Note

    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.

  3. Testare i collegamenti Modifica, Dettagli ed Elimina.

Il tutorial successivo spiega i file generati dallo 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-Old CLR Objects") perché non dipendono 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

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto RazorPagesMovie>Aggiungi>Nuova cartella. Denominare la cartella Models.

  2. Fare clic con il pulsante destro del mouse sulla Models cartella. Selezionare Aggiungi>Classe. Denominare la classe Movie.

  3. 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.

Creare la struttura di base del modello Film

In questa sezione viene eseguito lo scaffolding del modello *Movie*. Vale a dire, lo strumento di scaffolding genera pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello film.

  1. Creare una cartella Pages/Movies:

    1. Fare clic con il pulsante destro del mouse sulla cartella Pages>Aggiungi>Nuova cartella.
    2. Assegnare alla cartella il nome Movies.
  2. Fare clic con il pulsante destro del mouse sulla cartella Pages/Movies>Aggiungi>Nuovo elemento con scaffolding.

    Nuovo elemento guidato

  3. Nella finestra di dialogo Aggiungi scaffold, selezionare RazorPagine che usano Entity Framework (CRUD)>Aggiungi.

    Aggiungi scaffold

  4. Completare la finestra di dialogo Aggiungi Razor pagine usando Entity Framework (CRUD):

    1. Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).
    2. Nella riga Classe contesto di dati selezionare il segno più +.
      1. Nella finestra di dialogo Aggiungi contesto dati viene generato il nome RazorPagesMovie.Data.RazorPagesMovieContext della classe.
    3. Seleziona Aggiungi.

    Aggiungi Razor pagine

Il file appsettings.json viene aggiornato con la stringa di connessione utilizzata per connettersi a un database locale.

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 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.
  1. Nel menu Strumenti selezionare Gestione pacchetti NuGet>Console di Gestione pacchetti.

    Menu PMC

  2. Nella PMC, 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'. Ciò comporterà che i valori vengano troncati senza alcuna segnalazione se non rientrano nella precisione e nella 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'iniezione delle dipendenze

ASP.NET Core si basa sulla dependency injection. 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 del database e lo ha registrato nel contenitore di dependency injection.

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 funzionalità RazorPagesMovieContext coordina le operazioni EF Core, ad esempio Create, Read, Update e Delete, per il modello Movie. 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 la stringa di connessione dal file appsettings.json.

Testare l'app

  1. Eseguire l'app e accodare /Movies all'URL nel browser (http://localhost:port/movies).

    Se viene visualizzato il seguente errore:

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

    Hai saltato il passaggio delle migrazioni.

  2. Eseguire il test del collegamento Crea.

    Crea pagina

    Note

    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.

  3. 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 le risorse seguenti:

Il tutorial successivo spiega i file generati dallo 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).

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 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.

Creare la struttura di base del modello Film

In questa sezione viene eseguito lo scaffolding del modello *Movie*. Vale a dire, lo strumento di scaffolding genera pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello film.

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.

Nuovo elemento preconfigurato in VS Code

Nella finestra di dialogo Aggiungi scaffold, selezionare RazorPagine che usano Entity Framework (CRUD)>Aggiungi.

Aggiungi scaffold in VS Code

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 a RazorPagesMovie.Data.RazorPagesMovieContext. Questa modifica non è obbligatoria. Crea la classe del contesto del database con il namespace corretto.
  • Seleziona Aggiungi.

Aggiungere Razor pagine in VScode

Il file appsettings.json viene aggiornato con la stringa di connessione utilizzata 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

Updated

  • 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.

Menu PMC

Nella PMC, 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'. Ciò comporterà che i valori vengano troncati senza alcuna segnalazione se non rientrano nella precisione e nella 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'iniezione delle dipendenze

ASP.NET Core si basa sulla dependency injection. 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 del database e lo ha registrato nel contenitore di dependency injection.

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 funzionalità RazorPagesMovieContext coordina le operazioni EF Core, ad esempio Create, Read, Update e Delete, per il modello Movie. 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 la stringa di connessione dal file appsettings.json.

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'.

Hai saltato il passaggio delle migrazioni.

  • Eseguire il test del collegamento Crea.

    Crea pagina

    Note

    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.

Il tutorial successivo spiega i file generati dallo scaffolding.

Passaggi successivi