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 Criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 8 di questo articolo.

Importante

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

Per la versione corrente, vedere la versione .NET 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

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

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

  3. Nella finestra di dialogo Aggiungi nuovo scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.

    Aggiungere scaffolding

  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 selezionare SQL Server.
    3. Selezionare Aggiungi.

    Aggiungi Razor pagine

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.

    Menu della 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 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'). 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 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.

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

Testare l'app

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

  2. Testare il collegamento Crea nuovo .

    Creare una pagina

    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.

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

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

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

  3. Nella finestra di dialogo Aggiungi nuovo scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.

    Aggiungere scaffolding

  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 selezionare SQL Server.
    3. Selezionare Aggiungi.

    Aggiungi Razor pagine

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.

    Menu della 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 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'). 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 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.

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

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

  2. Testare il collegamento Crea nuovo .

    Creare una pagina

    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.

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

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

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

  3. Nella finestra di dialogo Aggiungi nuovo scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.

    Aggiungere scaffolding

  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 selezionare SQL Server.
    3. Selezionare Aggiungi.

    Aggiungi Razor pagine

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

    Menu della Console di Gestione pacchetti

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

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

  2. Testare il collegamento Crea nuovo .

    Creare una pagina

    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.

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

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

  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 scaffolding

  4. Nella finestra di dialogo Aggiungi nuovo scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.

    Aggiungere scaffolding

  5. 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. Selezionare Aggiungi.

    Aggiungi Razor pagine

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

    Menu della Console di Gestione pacchetti

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

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

  2. Testare il collegamento Crea nuovo .

    Creare una pagina

    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.

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

  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.

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.

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

  3. Nella finestra di dialogo Aggiungi scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.

    Aggiungere scaffolding

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

    Aggiungi Razor pagine

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

    Menu della Console di Gestione pacchetti

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

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

  2. Eseguire il test del collegamento Crea.

    Creare una pagina

    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.

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

Nuovo elemento con scaffolding in VScode

Nella finestra di dialogo Aggiungi scaffolding selezionareRazor Pagine con Entity Framework (CRUD)>Aggiungi.

Aggiungere scaffolding in VScode

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.

Aggiungere Razor pagine in VScode

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.

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

    Creare una pagina

    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.

Passaggi successivi