Aggiungere un modello a un'app Razor Pages in ASP.NET CoreAdd a model to a Razor Pages app in ASP.NET Core

Autore: Rick AndersonBy Rick Anderson

In questa sezione vengono aggiunte le classi per la gestione dei filmati.In this section, classes are added for managing movies. Le classi modello dell'app usano Entity Framework Core (EF Core) per lavorare con il database.The app's model classes use Entity Framework Core (EF Core) to work with the database. EF Core è un mapper relazionale a oggetti (O/RM) che semplifica l'accesso ai dati.EF Core is an object-relational mapper (O/RM) that simplifies data access.

Le classi di modello sono dette classi POCO (da "plain-old CLR objects") perché non hanno alcuna dipendenza in EF Core.The model classes are known as POCO classes (from "plain-old CLR objects") because they don't have any dependency on EF Core. Definiscono le proprietà dei dati archiviati nel database.They define the properties of the data that are stored in the database.

Aggiungere un modello di datiAdd a data model

Fare clic con il pulsante destro del mouse sul progetto RazorPagesMovie > Aggiungi > Nuova cartella.Right-click the RazorPagesMovie project > Add > New Folder. Assegnare il nome Modelli alla cartella.Name the folder Models.

Fare clic con il pulsante destro del mouse sulla cartella Models.Right click the Models folder. Selezionare Aggiungi > classe.Select Add > Class. Denominare la classe Movie.Name the class Movie.

Aggiungere le proprietà seguenti alla classe Movie:Add the following properties to the Movie class:

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:The Movie class contains:

  • Il campo ID è richiesto dal database per la chiave primaria.The ID field is required by the database for the primary key.

  • [DataType(DataType.Date)]: l'attributo DataType specifica il tipo di dati (Date).[DataType(DataType.Date)]: The DataType attribute specifies the type of the data (Date). Con questo attributo:With this attribute:

    • l'utente non deve immettere le informazioni temporali nel campo della data.The user is not required to enter time information in the date field.
    • Viene visualizzata solo la data, non le informazioni temporali.Only the date is displayed, not time information.

L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.DataAnnotations are covered in a later tutorial.

Compilare il progetto per verificare che non siano presenti errori di compilazione.Build the project to verify there are no compilation errors.

Eseguire lo scaffolding del modello di filmatoScaffold the movie model

In questa sezione viene eseguito lo scaffolding del modello Movie.In this section, the movie model is scaffolded. Lo strumento di scaffolding crea quindi le pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello Movie.That is, the scaffolding tool produces pages for Create, Read, Update, and Delete (CRUD) operations for the movie model.

Creare una cartella Pages/Movies:Create a Pages/Movies folder:

  • Fare clic con il pulsante destro del mouse sulla cartella Pages > Aggiungi > Nuova cartella.Right click on the Pages folder > Add > New Folder.
  • Assegnare il nome Movies alla cartellaName the folder Movies

Fare clic con il pulsante destro del mouse sulla cartella Pages/Movies > Aggiungi > Nuovo elemento di scaffolding.Right click on the Pages/Movies folder > Add > New Scaffolded Item.

Immagine relativa alle istruzioni precedenti.

Nella finestra di dialogo Aggiungi scaffolding selezionare Razor che usano Entity Framework (CRUD) > Aggiungi.In the Add Scaffold dialog, select Razor Pages using Entity Framework (CRUD) > Add.

Immagine relativa alle istruzioni precedenti.

Completare la finestra di dialogo Pagine Razor che usano Entity Framework (CRUD):Complete the Add Razor Pages using Entity Framework (CRUD) dialog:

  • Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).In the Model class drop down, select Movie (RazorPagesMovie.Models).
  • Nella riga Classe contesto di dati selezionare il segno più + e modificare il nome generato da RazorPagesMovie.Models.RazorPagesMovieContext a RazorPagesMovie.Data.RazorPagesMovieContext.In the Data context class row, select the + (plus) sign and change the generated name from RazorPagesMovie.Models.RazorPagesMovieContext to RazorPagesMovie.Data.RazorPagesMovieContext. Questa modifica non è obbligatoria.This change is not required. Crea la classe del contesto di database con lo spazio dei nomi corretto.It creates the database context class with the correct namespace.
  • Selezionare Aggiungi.Select Add.

Immagine relativa alle istruzioni precedenti.

Il file appsettings.json è stato aggiornato con la stringa di connessione usata per connettersi a un database locale.The appsettings.json file is updated with the connection string used to connect to a local database.

File creatiFiles created

Il processo di scaffolding crea e aggiorna i file seguenti:The scaffold process creates and updates the following files:

  • Pages/Movies: pagine Create (Crea), Delete (Elimina), Details (Dettagli), Edit (Modifica) e Index (Indice).Pages/Movies: Create, Delete, Details, Edit, and Index.
  • Data/RazorPagesMovieContext.csData/RazorPagesMovieContext.cs

AggiornatoUpdated

  • Startup.csStartup.cs

I file creati e aggiornati sono illustrati nella sezione successiva.The created and updated files are explained in the next section.

Migrazione inizialeInitial migration

In questa sezione viene usata la Console di Gestione pacchetti (PMC) per:In this section, the Package Manager Console (PMC) is used to:

  • Aggiungere una migrazione iniziale.Add an initial migration.
  • Aggiornare il database con la migrazione iniziale.Update the database with the initial migration.

Nel menu Strumenti selezionare Gestione pacchetti NuGet > Console di Gestione pacchetti.From the Tools menu, select NuGet Package Manager > Package Manager Console.

Menu della Console di Gestione pacchetti

Nella Console di Gestione pacchetti immettere i comandi seguenti:In the PMC, enter the following commands:

Add-Migration InitialCreate
Update-Database

I comandi precedenti generano l'avviso seguente: "nessun tipo specificato per la colonna decimale ' Price ' nel tipo di entità' Movie '.The preceding commands generate the following warning: "No type was specified for the decimal column 'Price' on entity type '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).This will cause values to be silently truncated if they do not fit in the default precision and scale. 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()')"Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'."

È possibile ignorare tale avviso. Verrà risolto in un'esercitazione successiva.You can ignore that warning, it will be fixed in a later tutorial.

Il comando Migrations genera il codice per creare lo schema del database iniziale.The migrations command generates code to create the initial database schema. Lo schema è basato sul modello specificato in DbContext.The schema is based on the model specified in DbContext. L'argomento InitialCreate viene usato per denominare le migrazioni.The InitialCreate argument is used to name the migrations. È possibile usare qualsiasi nome, ma per convenzione viene selezionato un nome che descrive la migrazione.Any name can be used, but by convention a name is selected that describes the migration.

Il update comando esegue il Up metodo nelle migrazioni che non sono state applicate.The update command runs the Up method in migrations that have not been applied. In tal caso, update esegue il Up metodo in migrazioni/<timestamp>_InitialCreate file. cs , che crea il database.In this case, update runs the Up method in Migrations/<time-stamp>_InitialCreate.cs file, which creates the database.

Esaminare il contesto registrato con l'inserimento di dipendenzeExamine the context registered with dependency injection

ASP.NET Core viene compilato tramite dependency injection.ASP.NET Core is built with dependency injection. I servizi, ad esempio il contesto di database di Entity Framework Core, vengono registrati tramite dependency injection durante l'avvio dell'applicazione.Services (such as the EF Core DB context) are registered with dependency injection during application startup. Questi servizi vengono quindi offerti ai componenti per cui sono necessari (ad esempio Razor Pages) tramite i parametri del costruttore.Components that require these services (such as Razor Pages) are provided these services via constructor parameters. Più avanti nell'esercitazione viene illustrato il codice del costruttore che ottiene un'istanza del contesto di database.The constructor code that gets a DB context instance is shown later in the tutorial.

Lo strumento di scaffolding ha creato automaticamente un contesto del database e lo ha registrato per la dependency injection.The scaffolding tool automatically created a DB context and registered it with the dependency injection container.

Esaminare il metodo Startup.ConfigureServices.Examine the Startup.ConfigureServices method. La riga evidenziata è stata aggiunta dallo scaffolder:The highlighted line was added by the scaffolder:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

RazorPagesMovieContext coordina la funzionalità di EF Core (Create, Read, Update, Delete e così via) per il modello Movie.The RazorPagesMovieContext coordinates EF Core functionality (Create, Read, Update, Delete, etc.) for the Movie model. Il contesto dei dati (RazorPagesMovieContext) è derivato da Microsoft.EntityFrameworkCore.DbContext.The data context (RazorPagesMovieContext) is derived from Microsoft.EntityFrameworkCore.DbContext. Il contesto dei dati specifica le entità incluse nel modello di dati.The data context specifies which entities are included in the data model.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Models
{
    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à.The preceding code creates a DbSet<Movie> property for the entity set. Nella terminologia di Entity Framework, un set di entità corrisponde in genere alla tabella di un database.In Entity Framework terminology, an entity set typically corresponds to a database table. Un'entità corrisponde a una riga nella tabella.An entity corresponds to a row in the table.

Il nome della stringa di connessione viene passato al contesto chiamando un metodo in un oggetto DbContextOptions.The name of the connection string is passed in to the context by calling a method on a DbContextOptions object. Per lo sviluppo locale, il sistema di configurazione di ASP.NET Core legge la stringa di connessione dal file appsettings.json.For local development, the ASP.NET Core configuration system reads the connection string from the appsettings.json file.

Testare l'appTest the app

  • Eseguire l'app e accodare /Movies all'URL nel browser (http://localhost:port/movies).Run the app and append /Movies to the URL in the browser (http://localhost:port/movies).

Se viene visualizzato l'errore:If you get the error:

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

Non è stato eseguita la migrazione.You missed the migrations step.

  • Eseguire il test del collegamento Crea.Test the Create link.

    Pagina di creazione

    Nota

    Potrebbe non essere possibile immettere virgole decimali nel campo Price.You may not be able to enter decimal commas in the Price field. 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.To support jQuery validation for non-English locales that use a comma (",") for a decimal point and for non US-English date formats, the app must be globalized. Per istruzioni sulla globalizzazione, vedere questo problema su GitHub.For globalization instructions, see this GitHub issue.

  • Testare i collegamenti Modifica, Dettagli ed Elimina.Test the Edit, Details, and Delete links.

L'esercitazione successiva illustra i file creati tramite scaffolding.The next tutorial explains the files created by scaffolding.

Risorse aggiuntiveAdditional resources

In questa sezione vengono aggiunte le classi per la gestione dei film in un database SQLitemultipiattaforma.In this section, classes are added for managing movies in a cross-platform SQLite database. Le app create da un modello di ASP.NET Core usano un database SQLite.Apps created from an ASP.NET Core template use a SQLite database. Le classi modello dell'app vengono usate con Entity Framework Core (EF Core) (SQLite EF Core provider di database) per lavorare con il database.The app's model classes are used with Entity Framework Core (EF Core) (SQLite EF Core Database Provider) to work with the database. EF Core è un framework ORM (Object-Relational Mapping) che semplifica l'accesso ai dati.EF Core is an object-relational mapping (ORM) framework that simplifies data access.

Le classi di modello sono dette classi POCO (da "plain-old CLR objects") perché non hanno alcuna dipendenza in EF Core.The model classes are known as POCO classes (from "plain-old CLR objects") because they don't have any dependency on EF Core. Definiscono le proprietà dei dati archiviati nel database.They define the properties of the data that are stored in the database.

Aggiungere un modello di datiAdd a data model

Fare clic con il pulsante destro del mouse sul progetto RazorPagesMovie > Aggiungi > Nuova cartella.Right-click the RazorPagesMovie project > Add > New Folder. Assegnare il nome Modelli alla cartella.Name the folder Models.

Fare clic con il pulsante destro del mouse sulla cartella Models.Right click the Models folder. Selezionare Aggiungi > classe.Select Add > Class. Denominare la classe Movie.Name the class Movie.

Aggiungere le proprietà seguenti alla classe Movie:Add the following properties to the Movie class:

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:The Movie class contains:

  • Il campo ID è richiesto dal database per la chiave primaria.The ID field is required by the database for the primary key.

  • [DataType(DataType.Date)]: l'attributo DataType specifica il tipo di dati (Date).[DataType(DataType.Date)]: The DataType attribute specifies the type of the data (Date). Con questo attributo:With this attribute:

    • l'utente non deve immettere le informazioni temporali nel campo della data.The user is not required to enter time information in the date field.
    • Viene visualizzata solo la data, non le informazioni temporali.Only the date is displayed, not time information.

L'attributo DataAnnotations viene analizzato in un'esercitazione successiva.DataAnnotations are covered in a later tutorial.

Compilare il progetto per verificare che non siano presenti errori di compilazione.Build the project to verify there are no compilation errors.

Eseguire lo scaffolding del modello di filmatoScaffold the movie model

In questa sezione viene eseguito lo scaffolding del modello Movie.In this section, the movie model is scaffolded. Lo strumento di scaffolding crea quindi le pagine per le operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione) per il modello Movie.That is, the scaffolding tool produces pages for Create, Read, Update, and Delete (CRUD) operations for the movie model.

Creare una cartella Pages/Movies:Create a Pages/Movies folder:

  • Fare clic con il pulsante destro del mouse sulla cartella Pages > Aggiungi > Nuova cartella.Right click on the Pages folder > Add > New Folder.
  • Assegnare il nome Movies alla cartellaName the folder Movies

Fare clic con il pulsante destro del mouse sulla cartella Pages/Movies > Aggiungi > Nuovo elemento di scaffolding.Right click on the Pages/Movies folder > Add > New Scaffolded Item.

Immagine relativa alle istruzioni precedenti.

Nella finestra di dialogo Aggiungi scaffolding selezionare Razor che usano Entity Framework (CRUD) > Aggiungi.In the Add Scaffold dialog, select Razor Pages using Entity Framework (CRUD) > Add.

Immagine relativa alle istruzioni precedenti.

Completare la finestra di dialogo Pagine Razor che usano Entity Framework (CRUD):Complete the Add Razor Pages using Entity Framework (CRUD) dialog:

  • Nel menu a discesa Classe modello selezionare Movie (RazorPagesMovie.Models).In the Model class drop down, select Movie (RazorPagesMovie.Models).
  • Nella riga Classe contesto di dati selezionare il segno più + e accettare il nome generato RazorPagesMovie.Models.RazorPagesMovieContext.In the Data context class row, select the + (plus) sign and accept the generated name RazorPagesMovie.Models.RazorPagesMovieContext.
  • Selezionare Aggiungi.Select Add.

Immagine relativa alle istruzioni precedenti.

Il file appsettings.json è stato aggiornato con la stringa di connessione usata per connettersi a un database locale.The appsettings.json file is updated with the connection string used to connect to a local database.

Il processo di scaffolding crea e aggiorna i file seguenti:The scaffold process creates and updates the following files:

File creatiFiles created

  • Pages/Movies: pagine Create (Crea), Delete (Elimina), Details (Dettagli), Edit (Modifica) e Index (Indice).Pages/Movies: Create, Delete, Details, Edit, and Index.
  • Data/RazorPagesMovieContext.csData/RazorPagesMovieContext.cs

File aggiornatoFile updated

  • Startup.csStartup.cs

I file creati e aggiornati sono illustrati nella sezione successiva.The created and updated files are explained in the next section.

Migrazione inizialeInitial migration

In questa sezione viene usata la Console di Gestione pacchetti (PMC) per:In this section, the Package Manager Console (PMC) is used to:

  • Aggiungere una migrazione iniziale.Add an initial migration.
  • Aggiornare il database con la migrazione iniziale.Update the database with the initial migration.

Nel menu Strumenti selezionare Gestione pacchetti NuGet > Console di Gestione pacchetti.From the Tools menu, select NuGet Package Manager > Package Manager Console.

Menu della Console di Gestione pacchetti

Nella Console di Gestione pacchetti immettere i comandi seguenti:In the PMC, enter the following commands:

Add-Migration Initial
Update-Database

Il comando Add-Migration genera un codice per creare lo schema del database iniziale.The Add-Migration command generates code to create the initial database schema. Lo schema è basato sul modello specificato in DbContext (nel file RazorPagesMovieContext.cs).The schema is based on the model specified in the DbContext (In the RazorPagesMovieContext.cs file). L' InitialCreate argomento viene usato per assegnare un nome alla migrazione.The InitialCreate argument is used to name the migration. È possibile usare qualsiasi nome, ma per convenzione viene usato un nome che descrive la migrazione.Any name can be used, but by convention a name that describes the migration is used. Per altre informazioni, vedere Esercitazione: uso della funzionalità Migrations-ASP.NET MVC con EF Core.For more information, see Esercitazione: uso della funzionalità Migrations-ASP.NET MVC con EF Core.

Il comando Update-Database esegue il metodo Up nel file Migrations/<time-stamp>_InitialCreate.cs.The Update-Database command runs the Up method in the Migrations/<time-stamp>_InitialCreate.cs file. Il metodo Up crea il database.The Up method creates the database.

Nota

I comandi precedenti generano l'avviso seguente: "nessun tipo specificato per la colonna decimale ' Price ' nel tipo di entità' Movie '. In questo modo i valori verranno troncati automaticamente se non rientrano nella precisione e nella scala predefinite. Specificare in modo esplicito il tipo di colonna di SQL Server in grado di contenere tutti i valori utilizzando ' HasColumnType ()'. È possibile ignorare l'avviso, che verrà risolto in un'esercitazione successiva.The preceding commands generate the following warning: "No type was specified for the decimal column 'Price' on entity type 'Movie'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'." You can ignore that warning, it will be fixed in a later tutorial.

Esaminare il contesto registrato con l'inserimento di dipendenzeExamine the context registered with dependency injection

ASP.NET Core viene compilato tramite dependency injection.ASP.NET Core is built with dependency injection. I servizi, ad esempio il contesto di database di Entity Framework Core, vengono registrati tramite dependency injection durante l'avvio dell'applicazione.Services (such as the EF Core DB context) are registered with dependency injection during application startup. Questi servizi vengono quindi offerti ai componenti per cui sono necessari (ad esempio Razor Pages) tramite i parametri del costruttore.Components that require these services (such as Razor Pages) are provided these services via constructor parameters. Più avanti nell'esercitazione viene illustrato il codice del costruttore che ottiene un'istanza del contesto di database.The constructor code that gets a DB context instance is shown later in the tutorial.

Lo strumento di scaffolding ha creato automaticamente un contesto del database e lo ha registrato per la dependency injection.The scaffolding tool automatically created a DB context and registered it with the dependency injection container.

Esaminare il metodo Startup.ConfigureServices.Examine the Startup.ConfigureServices method. La riga evidenziata è stata aggiunta dallo scaffolder:The highlighted line was added by the scaffolder:

// This method gets called by the runtime. 
// Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is 
        // needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(
          Configuration.GetConnectionString("RazorPagesMovieContext")));
}

RazorPagesMovieContext coordina la funzionalità di EF Core (Create, Read, Update, Delete e così via) per il modello Movie.The RazorPagesMovieContext coordinates EF Core functionality (Create, Read, Update, Delete, etc.) for the Movie model. Il contesto dei dati (RazorPagesMovieContext) è derivato da Microsoft.EntityFrameworkCore.DbContext.The data context (RazorPagesMovieContext) is derived from Microsoft.EntityFrameworkCore.DbContext. Il contesto dei dati specifica le entità incluse nel modello di dati.The data context specifies which entities are included in the data model.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Models
{
    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à.The preceding code creates a DbSet<Movie> property for the entity set. Nella terminologia di Entity Framework, un set di entità corrisponde in genere alla tabella di un database.In Entity Framework terminology, an entity set typically corresponds to a database table. Un'entità corrisponde a una riga nella tabella.An entity corresponds to a row in the table.

Il nome della stringa di connessione viene passato al contesto chiamando un metodo in un oggetto DbContextOptions.The name of the connection string is passed in to the context by calling a method on a DbContextOptions object. Per lo sviluppo locale, il sistema di configurazione di ASP.NET Core legge la stringa di connessione dal file appsettings.json.For local development, the ASP.NET Core configuration system reads the connection string from the appsettings.json file.

Testare l'appTest the app

  • Eseguire l'app e accodare /Movies all'URL nel browser (http://localhost:port/movies).Run the app and append /Movies to the URL in the browser (http://localhost:port/movies).

Se viene visualizzato l'errore:If you get the error:

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

Non è stato eseguita la migrazione.You missed the migrations step.

  • Eseguire il test del collegamento Crea.Test the Create link.

    Pagina di creazione

    Nota

    Potrebbe non essere possibile immettere virgole decimali nel campo Price.You may not be able to enter decimal commas in the Price field. 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.To support jQuery validation for non-English locales that use a comma (",") for a decimal point and for non US-English date formats, the app must be globalized. Per istruzioni sulla globalizzazione, vedere questo problema su GitHub.For globalization instructions, see this GitHub issue.

  • Testare i collegamenti Modifica, Dettagli ed Elimina.Test the Edit, Details, and Delete links.

L'esercitazione successiva illustra i file creati tramite scaffolding.The next tutorial explains the files created by scaffolding.

Risorse aggiuntiveAdditional resources