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, consulte la versión .NET 8 de este artículo.

Importante

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

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

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.")));

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

Cuando la aplicación se implementa en un servidor de prueba o producción, se puede utilizar una variable de entorno para establecer la cadena de conexión en un servidor de base de datos de prueba o producción. Para obtener más información, vea Configuración.

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

  1. En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).

    Menú Ver

  2. Haga clic con el botón derecho en la tabla Movie y seleccione Movie:

    Menús contextuales abiertos en la tabla Movie

    Tablas Movie abiertas en el diseñador

    Observe el icono de llave junto a ID. De forma predeterminada, EF crea una propiedad denominada ID para la clave principal.

  3. Haga clic con el botón derecho en la tabla Movie y seleccione Movie:

    Tabla Movie abierta mostrando datos de la tabla

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:

Aplicación de películas abierta en el explorador donde se muestran los datos de películas

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

Cuando la aplicación se implementa en un servidor de prueba o producción, se puede utilizar una variable de entorno para establecer la cadena de conexión en un servidor de base de datos de prueba o producción. Para obtener más información, vea Configuración.

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

  1. En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).

    Menú Ver

  2. Haga clic con el botón derecho en la tabla Movie y seleccione Movie:

    Menús contextuales abiertos en la tabla Movie

    Tablas Movie abiertas en el diseñador

    Observe el icono de llave junto a ID. De forma predeterminada, EF crea una propiedad denominada ID para la clave principal.

  3. Haga clic con el botón derecho en la tabla Movie y seleccione Movie:

    Tabla Movie abierta mostrando datos de la tabla

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:

Aplicación de películas abierta en el explorador donde se muestran los datos de películas

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

Cuando la aplicación se implementa en un servidor de prueba o producción, se puede utilizar una variable de entorno para establecer la cadena de conexión en un servidor de base de datos de prueba o producción. Para obtener más información, vea Configuración.

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

  1. En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).

    Menú Ver

  2. Haga clic con el botón derecho en la tabla Movie y seleccione Movie:

    Menús contextuales abiertos en la tabla Movie

    Tablas Movie abiertas en el diseñador

    Observe el icono de llave junto a ID. De forma predeterminada, EF crea una propiedad denominada ID para la clave principal.

  3. Haga clic con el botón derecho en la tabla Movie y seleccione Movie:

    Tabla Movie abierta mostrando datos de la tabla

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:

Aplicación de películas abierta en el explorador donde se muestran los datos de películas

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

Cuando la aplicación se implementa en un servidor de prueba o producción, se puede utilizar una variable de entorno para establecer la cadena de conexión en un servidor de base de datos de prueba o producción. Para obtener más información, vea Configuración.

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

  1. En el menú Ver, abra Explorador de objetos de SQL Server (SSOX).

    Menú Ver

  2. Haga clic con el botón derecho en la tabla Movie y seleccione Movie:

    Menús contextuales abiertos en la tabla Movie

    Tablas Movie abiertas en el diseñador

    Observe el icono de llave junto a ID. De forma predeterminada, EF crea una propiedad denominada ID para la clave principal.

  3. Haga clic con el botón derecho en la tabla Movie y seleccione Movie:

    Tabla Movie abierta mostrando datos de la tabla

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

  1. Elimine todos los registros de la base de datos. Use los vínculos de eliminación en el explorador o en SSOX.

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

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

      Icono Bandeja del sistema de IIS Express

      Menú contextual

    2. Si está ejecutando la aplicación en modo de no depuración, presione F5 para ejecutar en modo de depuración.

    3. Si la aplicación está en modo de depuración, detenga el depurador y presione F5.

La aplicación muestra los datos inicializados:

Aplicación de películas abierta en el explorador donde se muestran los datos de películas

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

Cuando la aplicación se implementa en un servidor de prueba o producción, se puede utilizar una variable de entorno para establecer la cadena de conexión en un servidor de base de datos de prueba o producción. Para más información, vea Configuración.

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

    Menú Ver

  • Haga clic con el botón derecho en la tabla Movie y seleccione Movie:

    Menús contextuales abiertos en la tabla Movie

    Tablas Movie abiertas en el diseñador

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 seleccione Movie:

    Tabla Movie abierta mostrando datos de la tabla

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:

      Icono Bandeja del sistema de IIS Express

      Menú contextual

      • 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:

La aplicación Movie se abre en Chrome y muestra datos de la película

Pasos siguientes