Parte 4 de la serie de tutoriales sobre Razor Pages
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.
Por Joe Audette
El objeto RazorPagesMovieContext
controla la tarea de conexión a la base de datos y asignación de objetos Movie
a los registros de la base de datos. El contexto de base de datos se registra con el contenedor de inserción de dependencias en 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.")));
El sistema Configuración de ASP.NET Core lee la clave ConnectionString
. Para el desarrollo local, la configuración obtiene la cadena de conexión del archivo appsettings.json
.
La cadena de conexión generada es similar al siguiente código JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-f2e0482c-952d-4b1c-afe9-a1a3dfe52e55;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB es una versión ligera del motor de base de datos de SQL Server Express dirigida al desarrollo de programas. LocalDB se inicia a petición y se ejecuta en modo de usuario, sin necesidad de una configuración compleja. De forma predeterminada, la base de datos LocalDB crea archivos *.mdf
en el directorio C:\Users\<user>\
.
En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).
Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:Observe el icono de llave junto a
ID
. De forma predeterminada, EF crea una propiedad denominadaID
para la clave principal.Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:
Inicializar la base de datos
Cree una nueva clase denominada SeedData
en la carpeta SeedData
con el código siguiente:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
Si hay alguna película en la base de datos, se devuelve el inicializador y no se agrega ninguna película.
if (context.Movie.Any())
{
return;
}
Agregar el inicializador
Actualice Program.cs
con el siguiente código resaltado:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
En el código anterior, Program.cs
se ha modificado para hacer lo siguiente:
- Obtener una instancia del contexto de base de datos desde el contenedor de inserción de dependencias (ID).
- Llame al método
seedData.Initialize
, pasándole la instancia de contexto de la base de datos. - Eliminar el contexto cuando el método de inicialización finalice. La instrucción using garantiza que se elimine el contexto.
La siguiente excepción se produce cuando no se ha ejecutado Update-Database
:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Prueba de la aplicación
Elimine todos los registros de la base de datos para que se ejecute el método de inicialización. Detenga e inicie la aplicación para inicializar la base de datos. Si la base de datos no se ha propagado, establezca un punto de interrupción en if (context.Movie.Any())
y revise paso a paso el código.
La aplicación muestra los datos inicializados:
Pasos siguientes
El objeto RazorPagesMovieContext
controla la tarea de conexión a la base de datos y asignación de objetos Movie
a los registros de la base de datos. El contexto de base de datos se registra con el contenedor de inserción de dependencias en 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();
El sistema Configuración de ASP.NET Core lee la clave ConnectionString
. Para el desarrollo local, la configuración obtiene la cadena de conexión del archivo appsettings.json
.
La cadena de conexión generada es similar al siguiente código JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB es una versión ligera del motor de base de datos de SQL Server Express dirigida al desarrollo de programas. LocalDB se inicia a petición y se ejecuta en modo de usuario, sin necesidad de una configuración compleja. De forma predeterminada, la base de datos LocalDB crea archivos *.mdf
en el directorio C:\Users\<user>\
.
En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).
Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:Observe el icono de llave junto a
ID
. De forma predeterminada, EF crea una propiedad denominadaID
para la clave principal.Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:
Inicializar la base de datos
Cree una nueva clase denominada SeedData
en la carpeta SeedData
con el código siguiente:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
Si hay alguna película en la base de datos, se devuelve el inicializador y no se agrega ninguna película.
if (context.Movie.Any())
{
return;
}
Agregar el inicializador
Actualice Program.cs
con el siguiente código resaltado:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
En el código anterior, Program.cs
se ha modificado para hacer lo siguiente:
- Obtener una instancia del contexto de base de datos desde el contenedor de inserción de dependencias (ID).
- Llame al método
seedData.Initialize
, pasándole la instancia de contexto de la base de datos. - Eliminar el contexto cuando el método de inicialización finalice. La instrucción using garantiza que se elimine el contexto.
La siguiente excepción se produce cuando no se ha ejecutado Update-Database
:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Prueba de la aplicación
Elimine todos los registros de la base de datos para que se ejecute el método de inicialización. Detenga e inicie la aplicación para inicializar la base de datos. Si la base de datos no se ha propagado, establezca un punto de interrupción en if (context.Movie.Any())
y revise paso a paso el código.
La aplicación muestra los datos inicializados:
Pasos siguientes
El objeto RazorPagesMovieContext
controla la tarea de conexión a la base de datos y asignación de objetos Movie
a los registros de la base de datos. El contexto de base de datos se registra con el contenedor de inserción de dependencias en 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();
El sistema Configuración de ASP.NET Core lee la clave ConnectionString
. Para el desarrollo local, la configuración obtiene la cadena de conexión del archivo appsettings.json
.
La cadena de conexión generada es similar al siguiente código JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB es una versión ligera del motor de base de datos de SQL Server Express dirigida al desarrollo de programas. LocalDB se inicia a petición y se ejecuta en modo de usuario, sin necesidad de una configuración compleja. De forma predeterminada, la base de datos LocalDB crea archivos *.mdf
en el directorio C:\Users\<user>\
.
En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).
Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:Observe el icono de llave junto a
ID
. De forma predeterminada, EF crea una propiedad denominadaID
para la clave principal.Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:
Inicializar la base de datos
Cree una nueva clase denominada SeedData
en la carpeta SeedData
con el código siguiente:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
Si hay alguna película en la base de datos, se devuelve el inicializador y no se agrega ninguna película.
if (context.Movie.Any())
{
return;
}
Agregar el inicializador
Actualice Program.cs
con el siguiente código resaltado:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
En el código anterior, Program.cs
se ha modificado para hacer lo siguiente:
- Obtener una instancia del contexto de base de datos desde el contenedor de inserción de dependencias (ID).
- Llame al método
seedData.Initialize
, pasándole la instancia de contexto de la base de datos. - Eliminar el contexto cuando el método de inicialización finalice. La instrucción using garantiza que se elimine el contexto.
La siguiente excepción se produce cuando no se ha ejecutado Update-Database
:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Prueba de la aplicación
Elimine todos los registros de la base de datos para que se ejecute el método de inicialización. Detenga e inicie la aplicación para inicializar la base de datos. Si la base de datos no se ha propagado, establezca un punto de interrupción en if (context.Movie.Any())
y revise paso a paso el código.
La aplicación muestra los datos inicializados:
Pasos siguientes
El objeto RazorPagesMovieContext
controla la tarea de conexión a la base de datos y asignación de objetos Movie
a los registros de la base de datos. El contexto de base de datos se registra con el contenedor de inserción de dependencias en 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();
El sistema Configuración de ASP.NET Core lee la clave ConnectionString
. Para el desarrollo local, la configuración obtiene la cadena de conexión del archivo appsettings.json
.
La cadena de conexión generada es similar al siguiente código JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB es una versión ligera del motor de base de datos de SQL Server Express dirigida al desarrollo de programas. LocalDB se inicia a petición y se ejecuta en modo de usuario, sin necesidad de una configuración compleja. De forma predeterminada, la base de datos LocalDB crea archivos *.mdf
en el directorio C:\Users\<user>\
.
En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).
Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:Observe el icono de llave junto a
ID
. De forma predeterminada, EF crea una propiedad denominadaID
para la clave principal.Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:
Inicializar la base de datos
Cree una nueva clase denominada SeedData
en la carpeta SeedData
con el código siguiente:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
Si hay alguna película en la base de datos, se devuelve el inicializador y no se agrega ninguna película.
if (context.Movie.Any())
{
return;
}
Agregar el inicializador
Actualice Program.cs
con el siguiente código resaltado:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
En el código anterior, Program.cs
se ha modificado para hacer lo siguiente:
- Obtener una instancia del contexto de base de datos desde el contenedor de inserción de dependencias (ID).
- Llame al método
seedData.Initialize
, pasándole la instancia de contexto de la base de datos. - Eliminar el contexto cuando el método de inicialización finalice. La instrucción using garantiza que se elimine el contexto.
La siguiente excepción se produce cuando no se ha ejecutado Update-Database
:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Prueba de la aplicación
Elimine todos los registros de la base de datos para que se ejecute el método de inicialización. Detenga e inicie la aplicación para inicializar la base de datos. Si la base de datos no se ha propagado, establezca un punto de interrupción en if (context.Movie.Any())
y revise paso a paso el código.
La aplicación muestra los datos inicializados:
Pasos siguientes
Vea o descargue el código de ejemplo (cómo descargarlo).
El objeto RazorPagesMovieContext
controla la tarea de conexión a la base de datos y asignación de objetos Movie
a los registros de la base de datos. El contexto de base de datos se registra con el contenedor de inserción de dependencias en el método ConfigureServices
de Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
El sistema Configuración de ASP.NET Core lee la clave ConnectionString
. Para el desarrollo local, la configuración obtiene la cadena de conexión del archivo appsettings.json
.
La cadena de conexión generada es similar al siguiente código JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB es una versión ligera del motor de base de datos de SQL Server Express dirigida al desarrollo de programas. LocalDB se inicia a petición y se ejecuta en modo de usuario, sin necesidad de una configuración compleja. De forma predeterminada, la base de datos LocalDB crea archivos *.mdf
en el directorio C:\Users\<user>\
.
En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).
Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:Observe el icono de llave junto a
ID
. De forma predeterminada, EF crea una propiedad denominadaID
para la clave principal.Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:
Inicializar la base de datos
Cree una nueva clase denominada SeedData
en la carpeta SeedData
con el código siguiente:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
Si hay alguna película en la base de datos, se devuelve el inicializador y no se agrega ninguna película.
if (context.Movie.Any())
{
return;
}
Agregar el inicializador
Reemplace el contenido del archivo Program.cs
por el código siguiente:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;
namespace RazorPagesMovie
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
En el código anterior, el método Main
se ha modificado para hacer lo siguiente:
- Obtener una instancia del contexto de base de datos desde el contenedor de inserción de dependencias.
- Llame al método
seedData.Initialize
, pasándole la instancia de contexto de la base de datos. - Eliminar el contexto cuando el método de inicialización finalice. La instrucción using garantiza que se elimine el contexto.
La siguiente excepción se produce cuando no se ha ejecutado Update-Database
:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Prueba de la aplicación
Elimine todos los registros de la base de datos. Use los vínculos de eliminación en el explorador o en SSOX.
Obligue a la aplicación a inicializarse (llame a los métodos de la clase
Startup
) para que se ejecute el método de inicialización. Para forzar la inicialización, se debe detener y reiniciar IIS Express. Detenga y reinicie IIS con cualquiera de los métodos siguientes:Haga clic con el botón derecho en el icono Bandeja del sistema de IIS Express del área de notificación y seleccione Salir o Detener sitio:
Si está ejecutando la aplicación en modo de no depuración, presione F5 para ejecutar en modo de depuración.
Si la aplicación está en modo de depuración, detenga el depurador y presione F5.
La aplicación muestra los datos inicializados:
Pasos siguientes
Vea o descargue el código de ejemplo (cómo descargarlo).
El objeto RazorPagesMovieContext
controla la tarea de conexión a la base de datos y asignación de objetos Movie
a los registros de la base de datos. El contexto de base de datos se registra con el contenedor de inserción de dependencias en el método ConfigureServices
de Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
El sistema Configuración de ASP.NET Core lee la clave ConnectionString
. Para el desarrollo local, la configuración obtiene la cadena de conexión del archivo appsettings.json
.
La cadena de conexión generada será similar a la siguiente:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
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.
SQL Server Express LocalDB
LocalDB es una versión ligera del motor de base de datos de SQL Server Express dirigida al desarrollo de programas. LocalDB se inicia a petición y se ejecuta en modo de usuario, sin necesidad de una configuración compleja. De forma predeterminada, la base de datos LocalDB crea archivos *.mdf
en el directorio C:\Users\<user>\
.
En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).
Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:
Observe el icono de llave junto a ID
. De forma predeterminada, EF crea una propiedad denominada ID
para la clave principal.
Haga clic con el botón derecho en la tabla
Movie
y seleccioneMovie
:
Inicializar la base de datos
Cree una nueva clase denominada SeedData
en la carpeta SeedData
con el código siguiente:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
Si hay alguna película en la base de datos, se devuelve el inicializador y no se agrega ninguna película.
if (context.Movie.Any())
{
return;
}
Agregar el inicializador
Reemplace el contenido del archivo Program.cs
por el código siguiente:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;
namespace RazorPagesMovie
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
En el código anterior, el método Main
se ha modificado para hacer lo siguiente:
- Obtener una instancia del contexto de base de datos desde el contenedor de inserción de dependencias.
- Llame al método
seedData.Initialize
, pasándole la instancia de contexto de la base de datos. - Eliminar el contexto cuando el método de inicialización finalice. La instrucción using garantiza que se elimine el contexto.
La siguiente excepción se produce cuando no se ha ejecutado Update-Database
:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Prueba de la aplicación
Elimine todos los registros de la base de datos. Use los vínculos de eliminación en el explorador o en SSOX.
Obligue a la aplicación a inicializarse (llame a los métodos de la clase
Startup
) para que se ejecute el método de inicialización. Para forzar la inicialización, se debe detener y reiniciar IIS Express. Detenga y reinicie IIS con cualquiera de los métodos siguientes:Haga clic con el botón derecho en el icono Bandeja del sistema de IIS Express del área de notificación y pulse en Salir o en Detener sitio:
- Si está ejecutando la aplicación en modo de no depuración, presione F5 para ejecutar en modo de depuración.
- Si la aplicación está en modo de depuración, detenga el depurador y presione F5.
La aplicación muestra los datos inicializados: