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, consulta la versión .NET 8 de este artículo.
Advertencia
Esta versión de ASP.NET Core ya no se admite. Para obtener más información, consulta la Directiva de soporte técnico de .NET y .NET Core. Para la versión actual, consulta 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
En el Explorador de soluciones, haz clic con el botón derecho en el proyecto RazorPagesMovie >Agregar>Nueva carpeta. Asigna a la carpeta el nombre
Models
.Haz 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.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.
Cree la 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.
En el cuadro de diálogo Agregar nuevo elemento scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.
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).
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
RazorPagesMovie.Data.RazorPagesMovieContext
. - En la lista desplegable Proveedor de base de datos, seleccione SQL Server.
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
- Seleccione Agregar.
El archivo appsettings.json
se actualiza con la cadena de conexión que se usa para conectarse a una base de datos local.
Advertencia
En este artículo se usa una base de datos local que no requiere que el usuario se autentique. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación para aplicaciones de prueba y producción implementadas, consulta Flujos de autenticación seguros.
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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
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.
En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.
En PMC, escriba el siguiente comando:
Add-Migration InitialCreate
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 enDbContext
. El argumentoInitialCreate
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.
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()").
En PMC, escriba el siguiente comando:
Update-Database
El comando
Update-Database
ejecuta el métodoUp
en las migraciones que no se han aplicado. En este caso, el comando ejecuta el métodoUp
en el archivoMigrations/<time-stamp>_InitialCreate.cs
, que crea la base de datos.
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
.
La clase RazorPagesMovieContext
del archivo Data/RazorPagesMovieContext.cs
generado:
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
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.
Seleccione el vínculo Crear nuevo.
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.
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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
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
En el Explorador de soluciones, haz clic con el botón derecho en el proyecto RazorPagesMovie >Agregar>Nueva carpeta. Asigna a la carpeta el nombre
Models
.Haz 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.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.
Cree la 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.
En el cuadro de diálogo Agregar nuevo elemento scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.
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).
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
RazorPagesMovie.Data.RazorPagesMovieContext
. - En la lista desplegable Proveedor de base de datos, seleccione SQL Server.
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
- Seleccione Agregar.
El archivo appsettings.json
se actualiza con la cadena de conexión que se usa para conectarse a una base de datos local.
Advertencia
En este artículo se usa una base de datos local que no requiere que el usuario se autentique. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación para aplicaciones de prueba y producción implementadas, consulta Flujos de autenticación seguros.
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.
En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.
En PMC, escriba el siguiente comando:
Add-Migration InitialCreate
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 enDbContext
. El argumentoInitialCreate
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.
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()").
En PMC, escriba el siguiente comando:
Update-Database
El comando
Update-Database
ejecuta el métodoUp
en las migraciones que no se han aplicado. En este caso, el comando ejecuta el métodoUp
en el archivoMigrations/<time-stamp>_InitialCreate.cs
, que crea la base de datos.
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
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.
Seleccione el vínculo Crear nuevo.
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.
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
En el Explorador de soluciones, haz clic con el botón derecho en el proyecto RazorPagesMovie >Agregar>Nueva carpeta. Asigna a la carpeta el nombre
Models
.Haz 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.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.
Cree la 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.
En el cuadro de diálogo Agregar nuevo elemento scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.
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).
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
RazorPagesMovie.Data.RazorPagesMovieContext
. - En la lista desplegable Proveedor de base de datos, seleccione SQL Server.
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
- Seleccione Agregar.
El archivo appsettings.json
se actualiza con la cadena de conexión que se usa para conectarse a una base de datos local.
Advertencia
En este artículo se usa una base de datos local que no requiere que el usuario se autentique. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación para aplicaciones de prueba y producción implementadas, consulta Flujos de autenticación seguros.
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.
En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.
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 enDbContext
. El argumentoInitialCreate
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étodoUp
en las migraciones que no se han aplicado. En este caso, el comando ejecuta el métodoUp
en el archivoMigrations/<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
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.
Seleccione el vínculo Crear nuevo.
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.
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
En el Explorador de soluciones, haz clic con el botón derecho en el proyecto RazorPagesMovie >Agregar>Nueva carpeta. Asigna a la carpeta el nombre
Models
.Haz 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.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.
Agregue el paquete NuGet
Microsoft.EntityFrameworkCore.Design
, que es necesario para la herramienta de scaffolding.- En el menú Herramientas, seleccione Administrador de paquetes NuGet>Administrar paquetes de NuGet para la solución.
- Seleccione la pestaña Examinar.
- Escriba
Microsoft.EntityFrameworkCore.Design
y selecciónelo en la lista. - Active Proyecto y seleccione Instalar.
- Seleccione Aceptar en el cuadro de diálogo Aceptación de la licencia.
Cree la 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.
En el cuadro de diálogo Agregar nuevo elemento scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.
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).
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
RazorPagesMovie.Data.RazorPagesMovieContext
.
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
- Seleccione Agregar.
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.
Advertencia
En este artículo se usa una base de datos local que no requiere que el usuario se autentique. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación para aplicaciones de prueba y producción implementadas, consulta Flujos de autenticación seguros.
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.
En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.
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
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.
Seleccione el vínculo Crear nuevo.
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.
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
En el Explorador de soluciones, haz clic con el botón derecho en el proyecto RazorPagesMovie >Agregar>Nueva carpeta. Asigna a la carpeta el nombre
Models
.Haz 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.
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.
En el cuadro de diálogo Agregar scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.
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).
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
RazorPagesMovie.Data.RazorPagesMovieContext
.
- En el cuadro de diálogo Agregar contexto de datos, se genera el nombre de clase
- Seleccione Agregar.
El archivo appsettings.json
se actualiza con la cadena de conexión que se usa para conectarse a una base de datos local.
Advertencia
En este artículo se usa una base de datos local que no requiere que el usuario se autentique. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación para aplicaciones de prueba y producción implementadas, consulta Flujos de autenticación seguros.
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.
En el menú Herramientas, seleccione Administrador de paquetes NuGet>Consola del Administrador de paquetes.
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
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.
Pruebe el vínculo 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.
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).
Advertencia
En este artículo se usa una base de datos local que no requiere que el usuario se autentique. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación para aplicaciones de prueba y producción implementadas, consulta Flujos de autenticación seguros.
Agregar un modelo de datos
Haz clic con el botón derecho en el proyecto RazorPagesMovie >Agregar>Nueva carpeta. Asigna a la carpeta el nombre Models
.
Haz 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.
En el cuadro de diálogo Agregar scaffold, seleccione Páginas de Razor que usan Entity Framework (CRUD)>Agregar.
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 Data context class, selecciona el signo + (más) y cambia 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.
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.
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.
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.