Parte 2. Adición de un modelo a una aplicación de Razor Pages en ASP.NET Core

Nota:

Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión .NET 8 de este artículo.

Importante

Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.

Para la versión actual, consulte la versión .NET 8 de este artículo.

En este tutorial, se agregan clases para administrar películas en una base de datos. Las clases de modelo de la aplicación usan Entity Framework Core (EF Core) para trabajar con la base de datos. EF Core es un asignador relacional de objetos (ORM) que simplifica el acceso a los datos. Primero escriba las clases de modelo, y EF Core crea la base de datos.

Las clases de modelo se conocen como clases POCO (del inglés "Plain-Old CLR Objects", objetos CLR antiguos sin formato) porque no tienen ninguna dependencia de EF Core. Definen las propiedades de los datos que se almacenan en la base de datos.

Agregar un modelo de datos

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto RazorPagesMovie>Agregar>Nueva carpeta. Asigne a la carpeta el nombre Models.

  2. Haga clic con el botón derecho en la carpeta Models. Seleccione Agregar>Clase. Asigne a la clase el nombre Película.

  3. Agregue las propiedades siguientes a la clase 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 clase Movie contiene:

  • La base de datos requiere el campo ID para la clave principal.

  • Un atributo [DataType] que especifica el tipo de datos en la propiedad ReleaseDate. Con este atributo:

    • El usuario no tiene que especificar información horaria en el campo de fecha.
    • Solo se muestra la fecha, no información horaria.
  • El signo de interrogación después de string indica que la propiedad admite un valor NULL. Para más información, consulte Tipos de referencia que admiten un valor NULL.

Los elementos DataAnnotations se tratan en un tutorial posterior.

Compile el proyecto para comprobar que no haya errores de compilación.

Aplicar scaffolding al modelo de película

En esta sección se aplica scaffolding al modelo de película; es decir, la herramienta de scaffolding genera páginas para las operaciones de creación, lectura, actualización y eliminación (CRUD) del modelo de película.

  1. Cree la carpeta Pages/Movies:

    1. Haga clic con el botón derecho en la carpeta Páginas>Agregar>Nueva carpeta.
    2. Asigne a la carpeta el nombre Movies.
  2. Haga clic con el botón derecho en la carpeta Pages/Movies>Agregar>Nuevo elemento con scaffolding.

    Nuevo elemento con scaffolding

  3. En el cuadro de diálogo Agregar nuevo elemento scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.

    Agregar scaffold

  4. Complete el cuadro de diálogo para agregar instancias de Razor Pages que usan Entity Framework (CRUD) :

    1. En la lista desplegable Clase de modelo, seleccione Movie (RazorPagesMovie.Models) .
    2. En la fila Clase de contexto de datos, seleccione el signo + (más).
      1. En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase RazorPagesMovie.Data.RazorPagesMovieContext.
      2. En la lista desplegable Proveedor de base de datos, seleccione SQL Server.
    3. Seleccione Agregar.

    Agregar Razor Pages

El archivo appsettings.json se actualiza con la cadena de conexión que se usa para conectarse a una base de datos local.

Archivos creados y actualizados

El proceso de scaffolding crea los archivos siguientes:

  • Pages/Movies: Create, Delete, Details, Edit e Index.
  • Data/RazorPagesMovieContext.cs

Los archivos creados se explican en el tutorial siguiente.

El proceso de scaffolding agrega el código resaltado siguiente al archivo Program.cs:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// 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();

Los cambios realizados al archivo Program.cs se explican más adelante en este tutorial.

Creación del esquema de la base de datos inicial mediante la característica de migración de EF

La característica de migraciones de Entity Framework Core permite:

  • Cree el esquema de la base de datos inicial.
  • Actualizar incrementalmente el esquema de base de datos para mantenerlo sincronizado con el modelo de datos de la aplicación. Se conservan los datos existentes en la base de datos.

En esta sección, la ventana de la Consola del Administrador de paquetes (PMC) se utiliza para:

  • Agregar una migración inicial.
  • Actualizar la base de datos con la migración inicial.
  1. En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.

    Menú de PMC

  2. En PCM, escriba los siguientes comandos:

    Add-Migration InitialCreate
    Update-Database
    
  • El comando Add-Migration genera el código para crear el esquema de base de datos inicial. El esquema se basa en el modelo especificado en DbContext. El argumento InitialCreate se usa para asignar nombre a las migraciones. Se puede usar cualquier nombre, pero, por convención, se selecciona uno que describa la migración.

  • El comando Update-Database ejecuta el método Up en las migraciones que no se han aplicado. En este caso, el comando ejecuta el método Up en el archivo Migrations/<time-stamp>_InitialCreate.cs, que crea la base de datos.

Se muestra la advertencia siguiente, que se soluciona en un paso posterior:

No type was specified for the decimal column "Price" on entity type "Movie" (No se ha especificado ningún tipo en la columna decimal "Price" en el tipo de entidad "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()" (Especifique de forma explícita el tipo de columna de SQL Server que pueda acomodar todos los valores mediante "HasColumnType()").

Contexto de datos RazorPagesMovieContext:

  • Deriva de Microsoft.EntityFrameworkCore.DbContext.
  • Especifica qué entidades se incluyen en el modelo de datos.
  • Coordina la funcionalidad de EF Core, como la creación, la lectura, la actualización y la eliminación, del modelo Movie.
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!;
    }
}

En el código anterior se crea una propiedad DbSet<Movie> para el conjunto de entidades. En la terminología de Entity Framework, un conjunto de entidades suele corresponder a una tabla de base de datos. Una entidad se corresponde con una fila de la tabla.

El nombre de la cadena de conexión se pasa al contexto mediante una llamada a un método en un objeto DbContextOptions. Para el desarrollo local, el sistema de configuración lee la cadena de conexión desde el archivo appsettings.json.

Prueba de la aplicación

  1. Ejecute la aplicación y anexe /Movies a la dirección URL en el explorador ( http://localhost:port/movies ).

    Si aparece el siguiente mensaje de error:

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

    Quiere decir que falta el paso de migraciones.

  2. Seleccione el vínculo Crear nuevo.

    Página Crear

    Nota

    Es posible que no pueda escribir comas decimales en el campo Price. La aplicación debe globalizarse para que la validación de jQuery sea compatible con configuraciones regionales distintas del inglés que usan una coma (",") en lugar de un punto decimal y formatos de fecha distintos del de Estados Unidos. Para obtener instrucciones sobre la globalización, consulte esta cuestión en GitHub.

  3. Pruebe los vínculos Editar, Detalles y Eliminar.

En el tutorial siguiente se explican los archivos creados mediante scaffolding.

Examinar el contexto registrado con la inserción de dependencias

ASP.NET Core integra la inserción de dependencias. Los servicios, como el contexto de base de datos de EF Core, se registran con inserción de dependencias durante el inicio de la aplicación. Estos servicios se proporcionan a los componentes que los necesitan (como páginas Razor) a través de parámetros de constructor. El código de constructor que obtiene una instancia de contexto de base de datos se muestra más adelante en el tutorial.

La herramienta de scaffolding creó de forma automática un contexto de base de datos y lo registró con el contenedor de inserción de dependencias. El proveedor de scaffolding agrega el código resaltado siguiente al archivo Program.cs:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// 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();

Solución de problemas con el ejemplo completo

Si experimenta un problema que no puede resolver, compare el código con el proyecto completado. Vea o descargue el proyecto completado (cómo descargarlo).

Pasos siguientes

En este tutorial, se agregan clases para administrar películas en una base de datos. Las clases de modelo de la aplicación usan Entity Framework Core (EF Core) para trabajar con la base de datos. EF Core es un asignador relacional de objetos (ORM) que simplifica el acceso a los datos. Primero escriba las clases de modelo, y EF Core crea la base de datos.

Las clases de modelo se conocen como clases POCO (del inglés "Plain-Old CLR Objects", objetos CLR antiguos sin formato) porque no tienen ninguna dependencia de EF Core. Definen las propiedades de los datos que se almacenan en la base de datos.

Agregar un modelo de datos

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto RazorPagesMovie>Agregar>Nueva carpeta. Asigne a la carpeta el nombre Models.

  2. Haga clic con el botón derecho en la carpeta Models. Seleccione Agregar>Clase. Asigne a la clase el nombre Película.

  3. Agregue las propiedades siguientes a la clase 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 clase Movie contiene:

  • La base de datos requiere el campo ID para la clave principal.

  • Un atributo [DataType] que especifica el tipo de datos en la propiedad ReleaseDate. Con este atributo:

    • El usuario no tiene que especificar información horaria en el campo de fecha.
    • Solo se muestra la fecha, no información horaria.
  • El signo de interrogación después de string indica que la propiedad admite un valor NULL. Para más información, consulte Tipos de referencia que admiten un valor NULL.

Los elementos DataAnnotations se tratan en un tutorial posterior.

Compile el proyecto para comprobar que no haya errores de compilación.

Aplicar scaffolding al modelo de película

En esta sección se aplica scaffolding al modelo de película; es decir, la herramienta de scaffolding genera páginas para las operaciones de creación, lectura, actualización y eliminación (CRUD) del modelo de película.

  1. Cree la carpeta Pages/Movies:

    1. Haga clic con el botón derecho en la carpeta Páginas>Agregar>Nueva carpeta.
    2. Asigne a la carpeta el nombre Movies.
  2. Haga clic con el botón derecho en la carpeta Pages/Movies>Agregar>Nuevo elemento con scaffolding.

    Nuevo elemento con scaffolding

  3. En el cuadro de diálogo Agregar nuevo elemento scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.

    Agregar scaffold

  4. Complete el cuadro de diálogo para agregar instancias de Razor Pages que usan Entity Framework (CRUD) :

    1. En la lista desplegable Clase de modelo, seleccione Movie (RazorPagesMovie.Models) .
    2. En la fila Clase de contexto de datos, seleccione el signo + (más).
      1. En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase RazorPagesMovie.Data.RazorPagesMovieContext.
      2. En la lista desplegable Proveedor de base de datos, seleccione SQL Server.
    3. Seleccione Agregar.

    Agregar Razor Pages

El archivo appsettings.json se actualiza con la cadena de conexión que se usa para conectarse a una base de datos local.

Archivos creados y actualizados

El proceso de scaffolding crea los archivos siguientes:

  • Pages/Movies: Create, Delete, Details, Edit e Index.
  • Data/RazorPagesMovieContext.cs

Los archivos creados se explican en el tutorial siguiente.

El proceso de scaffolding agrega el código resaltado siguiente al archivo Program.cs:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// 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();

Los cambios realizados al archivo Program.cs se explican más adelante en este tutorial.

Creación del esquema de la base de datos inicial mediante la característica de migración de EF

La característica de migraciones de Entity Framework Core permite:

  • Cree el esquema de la base de datos inicial.
  • Actualizar incrementalmente el esquema de base de datos para mantenerlo sincronizado con el modelo de datos de la aplicación. Se conservan los datos existentes en la base de datos.

En esta sección, la ventana de la Consola del Administrador de paquetes (PMC) se utiliza para:

  • Agregar una migración inicial.
  • Actualizar la base de datos con la migración inicial.
  1. En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.

    Menú de PMC

  2. En PCM, escriba los siguientes comandos:

    Add-Migration InitialCreate
    Update-Database
    
  • El comando Add-Migration genera el código para crear el esquema de base de datos inicial. El esquema se basa en el modelo especificado en DbContext. El argumento InitialCreate se usa para asignar nombre a las migraciones. Se puede usar cualquier nombre, pero, por convención, se selecciona uno que describa la migración.

  • El comando Update-Database ejecuta el método Up en las migraciones que no se han aplicado. En este caso, el comando ejecuta el método Up en el archivo Migrations/<time-stamp>_InitialCreate.cs, que crea la base de datos.

Se muestra la advertencia siguiente, que se soluciona en un paso posterior:

No type was specified for the decimal column "Price" on entity type "Movie" (No se ha especificado ningún tipo en la columna decimal "Price" en el tipo de entidad "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()" (Especifique de forma explícita el tipo de columna de SQL Server que pueda acomodar todos los valores mediante "HasColumnType()").

Contexto de datos RazorPagesMovieContext:

  • Deriva de Microsoft.EntityFrameworkCore.DbContext.
  • Especifica qué entidades se incluyen en el modelo de datos.
  • Coordina la funcionalidad de EF Core, como la creación, la lectura, la actualización y la eliminación, del modelo Movie.
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!;
    }
}

En el código anterior se crea una propiedad DbSet<Movie> para el conjunto de entidades. En la terminología de Entity Framework, un conjunto de entidades suele corresponder a una tabla de base de datos. Una entidad se corresponde con una fila de la tabla.

El nombre de la cadena de conexión se pasa al contexto mediante una llamada a un método en un objeto DbContextOptions. Para el desarrollo local, el sistema de configuración lee la cadena de conexión desde el archivo appsettings.json.

Prueba de la aplicación

  1. Ejecute la aplicación y anexe /Movies a la dirección URL en el explorador ( http://localhost:port/movies ).

    Si aparece el siguiente mensaje de error:

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

    Quiere decir que falta el paso de migraciones.

  2. Seleccione el vínculo Crear nuevo.

    Página Crear

    Nota

    Es posible que no pueda escribir comas decimales en el campo Price. La aplicación debe globalizarse para que la validación de jQuery sea compatible con configuraciones regionales distintas del inglés que usan una coma (",") en lugar de un punto decimal y formatos de fecha distintos del de Estados Unidos. Para obtener instrucciones sobre la globalización, consulte esta cuestión en GitHub.

  3. Pruebe los vínculos Editar, Detalles y Eliminar.

En el tutorial siguiente se explican los archivos creados mediante scaffolding.

Examinar el contexto registrado con la inserción de dependencias

ASP.NET Core integra la inserción de dependencias. Los servicios, como el contexto de base de datos de EF Core, se registran con inserción de dependencias durante el inicio de la aplicación. Estos servicios se proporcionan a los componentes que los necesitan (como páginas Razor) a través de parámetros de constructor. El código de constructor que obtiene una instancia de contexto de base de datos se muestra más adelante en el tutorial.

La herramienta de scaffolding creó de forma automática un contexto de base de datos y lo registró con el contenedor de inserción de dependencias. El proveedor de scaffolding agrega el código resaltado siguiente al archivo Program.cs:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// 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();

Solución de problemas con el ejemplo completo

Si experimenta un problema que no puede resolver, compare el código con el proyecto completado. Vea o descargue el proyecto completado (cómo descargarlo).

Pasos siguientes

En este tutorial, se agregan clases para administrar películas en una base de datos. Las clases de modelo de la aplicación usan Entity Framework Core (EF Core) para trabajar con la base de datos. EF Core es un asignador relacional de objetos (ORM) que simplifica el acceso a los datos. Primero escriba las clases de modelo, y EF Core crea la base de datos.

Las clases de modelo se conocen como clases POCO (del inglés "Plain-Old CLR Objects", objetos CLR antiguos sin formato) porque no tienen ninguna dependencia de EF Core. Definen las propiedades de los datos que se almacenan en la base de datos.

Agregar un modelo de datos

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto RazorPagesMovie>Agregar>Nueva carpeta. Asigne a la carpeta el nombre Models.

  2. Haga clic con el botón derecho en la carpeta Models. Seleccione Agregar>Clase. Asigne a la clase el nombre Película.

  3. Agregue las propiedades siguientes a la clase 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 clase Movie contiene:

  • La base de datos requiere el campo ID para la clave principal.

  • Un atributo [DataType] que especifica el tipo de datos en la propiedad ReleaseDate. Con este atributo:

    • El usuario no tiene que especificar información horaria en el campo de fecha.
    • Solo se muestra la fecha, no información horaria.

Los elementos DataAnnotations se tratan en un tutorial posterior.

Compile el proyecto para comprobar que no haya errores de compilación.

Aplicar scaffolding al modelo de película

En esta sección se aplica scaffolding al modelo de película; es decir, la herramienta de scaffolding genera páginas para las operaciones de creación, lectura, actualización y eliminación (CRUD) del modelo de película.

  1. Agregue el paquete NuGet Microsoft.EntityFrameworkCore.Design, que es necesario para la herramienta de scaffolding.

    1. En el menú Herramientas, seleccione Administrador de paquetes NuGet>Administrar paquetes de NuGet para la soluciónAdministrador de paquetes NuGet: administrar.
    2. Seleccione la pestaña Examinar.
    3. Escriba Microsoft.EntityFrameworkCore.Design y selecciónelo en la lista.
    4. Active Proyecto y seleccione Instalar.
    5. Seleccione Aceptar en el cuadro de diálogo Aceptación de la licencia. Administrador de paquetes NuGet: agregar paquete
  2. Cree la carpeta Pages/Movies:

    1. Haga clic con el botón derecho en la carpeta Páginas>Agregar>Nueva carpeta.
    2. Asigne a la carpeta el nombre Movies.
  3. Haga clic con el botón derecho en la carpeta Pages/Movies>Agregar>Nuevo elemento con scaffolding.

    Nuevo elemento con scaffolding

  4. En el cuadro de diálogo Agregar nuevo elemento scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.

    Agregar scaffold

  5. Complete el cuadro de diálogo para agregar instancias de Razor Pages que usan Entity Framework (CRUD) :

    1. En la lista desplegable Clase de modelo, seleccione Movie (RazorPagesMovie.Models) .
    2. En la fila Clase de contexto de datos, seleccione el signo + (más).
      1. En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase RazorPagesMovie.Data.RazorPagesMovieContext.
    3. Seleccione Agregar.

    Agregar Razor Pages

    Si recibe un mensaje de error en el que se indica que tiene que instalar el paquete Microsoft.EntityFrameworkCore.SqlServer, repita los pasos desde Agregar>Nuevo elemento con scaffolding.

El archivo appsettings.json se actualiza con la cadena de conexión que se usa para conectarse a una base de datos local.

Archivos creados y actualizados

El proceso de scaffolding crea los archivos siguientes:

  • Pages/Movies: Create, Delete, Details, Edit e Index.
  • Data/RazorPagesMovieContext.cs

Los archivos creados se explican en el tutorial siguiente.

El proceso de scaffolding agrega el código resaltado siguiente al archivo Program.cs:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// 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();

Los cambios realizados al archivo Program.cs se explican más adelante en este tutorial.

Creación del esquema de la base de datos inicial mediante la característica de migración de EF

La característica de migraciones de Entity Framework Core permite:

  • Cree el esquema de la base de datos inicial.
  • Actualizar incrementalmente el esquema de base de datos para mantenerlo sincronizado con el modelo de datos de la aplicación. Se conservan los datos existentes en la base de datos.

En esta sección, la ventana de la Consola del Administrador de paquetes (PMC) se utiliza para:

  • Agregar una migración inicial.
  • Actualizar la base de datos con la migración inicial.
  1. En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.

    Menú de PMC

  2. En PCM, escriba los siguientes comandos:

    Add-Migration InitialCreate
    Update-Database
    
    

Los comandos anteriores instalan las herramientas de Entity Framework Core y ejecutan el comando migrations para generar código que crea el esquema de base de datos inicial.

Se muestra la advertencia siguiente, que se soluciona en un paso posterior:

No type was specified for the decimal column "Price" on entity type "Movie" (No se ha especificado ningún tipo en la columna decimal "Price" en el tipo de entidad "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()" (Especifique de forma explícita el tipo de columna de SQL Server que pueda acomodar todos los valores mediante "HasColumnType()").

El comando migrations genera el código para crear el esquema de base de datos inicial. El esquema se basa en el modelo especificado en DbContext. El argumento InitialCreate se usa para asignar nombre a las migraciones. Se puede usar cualquier nombre, pero, por convención, se selecciona uno que describa la migración.

El comando update ejecuta el método Up en las migraciones que no se han aplicado. En este caso, update ejecuta el método Up en el archivo Migrations/<time-stamp>_InitialCreate.cs, que crea la base de datos.

Examinar el contexto registrado con la inserción de dependencias

ASP.NET Core integra la inserción de dependencias. Los servicios, como el contexto de base de datos de EF Core, se registran con inserción de dependencias durante el inicio de la aplicación. Estos servicios se proporcionan a los componentes que los necesitan (como páginas Razor) a través de parámetros de constructor. El código de constructor que obtiene una instancia de contexto de base de datos se muestra más adelante en el tutorial.

La herramienta de scaffolding creó de forma automática un contexto de base de datos y lo registró con el contenedor de inserción de dependencias. El proveedor de scaffolding agrega el código resaltado siguiente al archivo Program.cs:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// 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();

Contexto de datos RazorPagesMovieContext:

  • Deriva de Microsoft.EntityFrameworkCore.DbContext.
  • Especifica qué entidades se incluyen en el modelo de datos.
  • Coordina la funcionalidad de EF Core, como la creación, la lectura, la actualización y la eliminación, del modelo Movie.
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; }
    }
}

En el código anterior se crea una propiedad DbSet<Movie> para el conjunto de entidades. En la terminología de Entity Framework, un conjunto de entidades suele corresponder a una tabla de base de datos. Una entidad se corresponde con una fila de la tabla.

El nombre de la cadena de conexión se pasa al contexto mediante una llamada a un método en un objeto DbContextOptions. Para el desarrollo local, el sistema de configuración lee la cadena de conexión desde el archivo appsettings.json.

Prueba de la aplicación

  1. Ejecute la aplicación y anexe /Movies a la dirección URL en el explorador ( http://localhost:port/movies ).

    Si aparece el siguiente mensaje de error:

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

    Quiere decir que falta el paso de migraciones.

  2. Seleccione el vínculo Crear nuevo.

    Página Crear

    Nota

    Es posible que no pueda escribir comas decimales en el campo Price. La aplicación debe globalizarse para que la validación de jQuery sea compatible con configuraciones regionales distintas del inglés que usan una coma (",") en lugar de un punto decimal y formatos de fecha distintos del de Estados Unidos. Para obtener instrucciones sobre la globalización, consulte esta cuestión en GitHub.

  3. Pruebe los vínculos Editar, Detalles y Eliminar.

En el tutorial siguiente se explican los archivos creados mediante scaffolding.

Solución de problemas con el ejemplo completo

Si experimenta un problema que no puede resolver, compare el código con el proyecto completado. Vea o descargue el proyecto completado (cómo descargarlo).

Pasos siguientes

En esta sección, se agregan clases para administrar películas en una base de datos. Las clases de modelo de la aplicación usan Entity Framework Core (EF Core) para trabajar con la base de datos. EF Core es un asignador relacional de objetos (ORM) que simplifica el acceso a los datos. Primero escriba las clases de modelo, y EF Core crea la base de datos.

Las clases de modelo se conocen como clases POCO (del inglés "Plain-Old CLR Objects", objetos CLR antiguos sin formato) porque no tienen ninguna dependencia de EF Core. Definen las propiedades de los datos que se almacenan en la base de datos.

Vea o descargue el código de ejemplo (cómo descargarlo).

Agregar un modelo de datos

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto RazorPagesMovie>Agregar>Nueva carpeta. Asigne a la carpeta el nombre Models.

  2. Haga clic con el botón derecho en la carpeta Models. Seleccione Agregar>Clase. Asigne a la clase el nombre Película.

  3. Agregue las propiedades siguientes a la clase 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 clase Movie contiene:

  • La base de datos requiere el campo ID para la clave principal.

  • [DataType(DataType.Date)]: el atributo [DataType] especifica el tipo de datos (Date). Con este atributo:

    • El usuario no tiene que especificar información horaria en el campo de fecha.
    • Solo se muestra la fecha, no información horaria.

Los elementos DataAnnotations se tratan en un tutorial posterior.

Compile el proyecto para comprobar que no haya errores de compilación.

Aplicar scaffolding al modelo de película

En esta sección se aplica scaffolding al modelo de película; es decir, la herramienta de scaffolding genera páginas para las operaciones de creación, lectura, actualización y eliminación (CRUD) del modelo de película.

  1. Cree una carpeta Pages/Movies:

    1. Haga clic con el botón derecho en la carpeta Páginas>Agregar>Nueva carpeta.
    2. Asigne a la carpeta el nombre Movies.
  2. Haga clic con el botón derecho en la carpeta Pages/Movies>Agregar>Nuevo elemento con scaffolding.

    Nuevo elemento con scaffolding

  3. En el cuadro de diálogo Agregar scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.

    Agregar scaffold

  4. Complete el cuadro de diálogo para agregar instancias de Razor Pages que usan Entity Framework (CRUD) :

    1. En la lista desplegable Clase de modelo, seleccione Movie (RazorPagesMovie.Models) .
    2. En la fila Clase de contexto de datos, seleccione el signo + (más).
      1. En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase RazorPagesMovie.Data.RazorPagesMovieContext.
    3. Seleccione Agregar.

    Agregar Razor Pages

El archivo appsettings.json se actualiza con la cadena de conexión que se usa para conectarse a una base de datos local.

Archivos creados y actualizados

El proceso de scaffolding crea los archivos siguientes:

  • Pages/Movies: Create, Delete, Details, Edit e Index.
  • Data/RazorPagesMovieContext.cs

Archivos actualizados

  • Startup.cs

Los archivos creados y actualizados se explican en la sección siguiente.

Creación del esquema de la base de datos inicial mediante la característica de migración de EF

La característica de migraciones de Entity Framework Core permite:

  • Cree el esquema de la base de datos inicial.
  • Actualizar incrementalmente el esquema de base de datos para mantenerlo sincronizado con el modelo de datos de la aplicación. Se conservan los datos existentes en la base de datos.

En esta sección, la ventana de la Consola del Administrador de paquetes (PMC) se utiliza para:

  • Agregar una migración inicial.
  • Actualizar la base de datos con la migración inicial.
  1. En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.

    Menú de PMC

  2. En PCM, escriba los siguientes comandos:

    Add-Migration InitialCreate
    Update-Database
    

Para SQL Server, los comandos anteriores generan la advertencia siguiente: "No type was specified for the decimal column 'Price' on entity type 'Movie' (No se ha especificado ningún tipo en la columna decimal "Price" en el tipo de entidad "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()'." ("No se ha especificado ningún tipo en la columna decimal 'Price' en el tipo de entidad 'Movie'. Esto hará que los valores se trunquen inadvertidamente si no caben según la precisión y escala predeterminados. Especifique expresamente el tipo de columna de SQL Server que tenga cabida para todos los valores usando 'HasColumnType()'.")

Ignore la advertencia, ya que se tratará en un paso posterior.

El comando migrations genera el código para crear el esquema de base de datos inicial. El esquema se basa en el modelo especificado en DbContext. El argumento InitialCreate se usa para asignar nombre a las migraciones. Se puede usar cualquier nombre, pero, por convención, se selecciona uno que describa la migración.

El comando update ejecuta el método Up en las migraciones que no se han aplicado. En este caso, update ejecuta el método Up en el archivo Migrations/<time-stamp>_InitialCreate.cs, que crea la base de datos.

Examinar el contexto registrado con la inserción de dependencias

ASP.NET Core integra la inserción de dependencias. Los servicios, como el contexto de base de datos de EF Core, se registran con inserción de dependencias durante el inicio de la aplicación. Estos servicios se proporcionan a los componentes que los necesitan (como páginas Razor) a través de parámetros de constructor. El código de constructor que obtiene una instancia de contexto de base de datos se muestra más adelante en el tutorial.

La herramienta de scaffolding creó de forma automática un contexto de base de datos y lo registró con el contenedor de inserción de dependencias.

Examine el método Startup.ConfigureServices. El proveedor de scaffolding ha agregado la línea resaltada:

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

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

RazorPagesMovieContext coordina la funcionalidad de EF Core, como la creación, la lectura, la actualización y la eliminación, del modelo Movie. El contexto de datos (RazorPagesMovieContext) se deriva de Microsoft.EntityFrameworkCore.DbContext. En el contexto de datos se especifica qué entidades se incluyen en el modelo de datos.

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

En el código anterior se crea una propiedad DbSet<Movie> para el conjunto de entidades. En la terminología de Entity Framework, un conjunto de entidades suele corresponder a una tabla de base de datos. Una entidad se corresponde con una fila de la tabla.

El nombre de la cadena de conexión se pasa al contexto mediante una llamada a un método en un objeto DbContextOptions. Para el desarrollo local, el sistema de configuración lee la cadena de conexión desde el archivo appsettings.json.

Prueba de la aplicación

  1. Ejecute la aplicación y anexe /Movies a la dirección URL en el explorador ( http://localhost:port/movies ).

    Si aparece el siguiente mensaje de error:

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

    Quiere decir que falta el paso de migraciones.

  2. Pruebe el vínculo Crear.

    Página Crear

    Nota

    Es posible que no pueda escribir comas decimales en el campo Price. La aplicación debe globalizarse para que la validación de jQuery sea compatible con configuraciones regionales distintas del inglés que usan una coma (",") en lugar de un punto decimal y formatos de fecha distintos del de Estados Unidos. Para obtener instrucciones sobre la globalización, consulte esta cuestión en GitHub.

  3. Pruebe los vínculos Editar, Detalles y Eliminar.

Registros SQL de Entity Framework Core

La configuración de registros suele proporcionarla la sección Logging de los archivos appsettings.{Environment}.json. Para registrar instrucciones SQL, agregue "Microsoft.EntityFrameworkCore.Database.Command": "Information" al archivo appsettings.Development.json:

{
  "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 el archivo JSON anterior, las instrucciones SQL se muestran en la línea de comandos y en ventana de salida de Visual Studio.

Para más información, vea Registros en .NET Core y ASP.NET Core y esta incidencia de GitHub.

En el tutorial siguiente se explican los archivos creados mediante scaffolding.

Pasos siguientes

En esta sección, se agregan clases para administrar películas. Las clases de modelo de la aplicación usan Entity Framework Core (EF Core) para trabajar con la base de datos. EF Core es un asignador relacional de objetos (ORM) que simplifica el acceso a los datos.

Las clases de modelo se conocen como clases POCO (del inglés "plain-old CLR objects", objetos CLR antiguos sin formato) porque no tienen ninguna dependencia de EF Core. Definen las propiedades de los datos que se almacenan en la base de datos.

Vea o descargue el código de ejemplo (cómo descargarlo).

Agregar un modelo de datos

Haga clic con el botón derecho en el proyecto RazorPagesMovie>Agregar>Nueva carpeta. Asigne a la carpeta el nombre Models.

Haga clic con el botón derecho en la carpeta Models. Seleccione Agregar>Clase. Asigne a la clase el nombre Película.

Agregue las propiedades siguientes a la clase 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 clase Movie contiene:

  • La base de datos requiere el campo ID para la clave principal.

  • [DataType(DataType.Date)]: el atributo DataType especifica el tipo de datos (Date). Con este atributo:

    • El usuario no tiene que especificar información horaria en el campo de fecha.
    • Solo se muestra la fecha, no información horaria.

Los elementos DataAnnotations se tratan en un tutorial posterior.

Los elementos DataAnnotations se tratan en un tutorial posterior.

Compile el proyecto para comprobar que no haya errores de compilación.

Aplicar scaffolding al modelo de película

En esta sección se aplica scaffolding al modelo de película; es decir, la herramienta de scaffolding genera páginas para las operaciones de creación, lectura, actualización y eliminación (CRUD) del modelo de película.

Cree una carpeta Pages/Movies:

  • Haga clic con el botón derecho en la carpeta Páginas>Agregar>Nueva carpeta.
  • Asigne a la carpeta el nombre Movies.

Haga clic con el botón derecho en la carpeta Pages/Movies>Agregar>Nuevo elemento con scaffolding.

Nuevo elemento con scaffolding en VSCode

En el cuadro de diálogo Agregar scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.

Adición de scaffolding en VSCode

Complete el cuadro de diálogo para agregar instancias de Razor Pages que usan Entity Framework (CRUD) :

  • En la lista desplegable Clase de modelo, seleccione Movie (RazorPagesMovie.Models) .
  • En la fila Clase de contexto de datos, seleccione el signo + (más) y cambie el nombre generado de RazorPagesMovie.Models.RazorPagesMovieContext a RazorPagesMovie.Data.RazorPagesMovieContext. Este cambio no es necesario. Crea la clase de contexto de datos con el espacio de nombres correcto.
  • Seleccione Agregar.

Agregar Razor Pages en VScode

El archivo appsettings.json se actualiza con la cadena de conexión que se usa para conectarse a una base de datos local.

Archivos creados

El proceso de scaffolding crea y actualiza los archivos siguientes:

  • Pages/Movies: Create, Delete, Details, Edit e Index.
  • Data/RazorPagesMovieContext.cs

Actualizado

  • Startup.cs

Los archivos creados y actualizados se explican en la sección siguiente.

Migración inicial

En esta sección, la Consola del administrador de paquetes (PMC) se utiliza para:

  • Agregar una migración inicial.
  • Actualizar la base de datos con la migración inicial.

En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.

Menú de PMC

En PCM, escriba los siguientes comandos:

Add-Migration InitialCreate
Update-Database

Los comandos anteriores generan la advertencia siguiente: "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()'." ("No se ha especificado ningún tipo en la columna decimal 'Price' en el tipo de entidad 'Movie'. Esto hará que los valores se trunquen inadvertidamente si no caben según la precisión y escala predeterminados. Especifique expresamente el tipo de columna de SQL Server que tenga cabida para todos los valores usando 'HasColumnType()'.")

Ignore la advertencia, ya que se tratará en un paso posterior.

El comando migrations genera código para crear el esquema de base de datos inicial. El esquema se basa en el modelo especificado en DbContext. El argumento InitialCreate se usa para asignar nombre a las migraciones. Se puede usar cualquier nombre, pero, por convención, se selecciona uno que describa la migración.

El comando update ejecuta el método Up en las migraciones que no se han aplicado. En este caso, update ejecuta el método Up en el archivo Migrations/<time-stamp>_InitialCreate.cs, que crea la base de datos.

Examinar el contexto registrado con la inserción de dependencias

ASP.NET Core integra la inserción de dependencias. Los servicios, como el contexto de base de datos de EF Core, se registran con inserción de dependencias durante el inicio de la aplicación. Estos servicios se proporcionan a los componentes que los necesitan, como páginas Razor, a través de parámetros de constructor. El código de constructor que obtiene una instancia de contexto de base de datos se muestra más adelante en el tutorial.

La herramienta de scaffolding creó de forma automática un contexto de base de datos y lo registró con el contenedor de inserción de dependencias.

Examine el método Startup.ConfigureServices. El proveedor de scaffolding ha agregado la línea resaltada:

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

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

RazorPagesMovieContext coordina la funcionalidad de EF Core, como la creación, la lectura, la actualización y la eliminación, del modelo Movie. El contexto de datos (RazorPagesMovieContext) se deriva de Microsoft.EntityFrameworkCore.DbContext. En el contexto de datos se especifica qué entidades se incluyen en el modelo de datos.

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

En el código anterior se crea una propiedad DbSet<Movie> para el conjunto de entidades. En la terminología de Entity Framework, un conjunto de entidades suele corresponder a una tabla de base de datos. Una entidad se corresponde con una fila de la tabla.

El nombre de la cadena de conexión se pasa al contexto mediante una llamada a un método en un objeto DbContextOptions. Para el desarrollo local, el sistema de configuración lee la cadena de conexión desde el archivo appsettings.json.

Prueba de la aplicación

  • Ejecute la aplicación y anexe /Movies a la dirección URL en el explorador ( http://localhost:port/movies ).

Si se produce un error:

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

Quiere decir que falta el paso de migraciones.

  • Pruebe el vínculo Crear.

    Página Crear

    Nota

    Es posible que no pueda escribir comas decimales en el campo Price. La aplicación debe globalizarse para que la validación de jQuery sea compatible con configuraciones regionales distintas del inglés que usan una coma (",") en lugar de un punto decimal y formatos de fecha distintos del de Estados Unidos. Para obtener instrucciones sobre la globalización, consulte esta cuestión en GitHub.

  • Pruebe los vínculos Editar, Detalles y Eliminar.

En el tutorial siguiente se explican los archivos creados mediante scaffolding.

Pasos siguientes