Share via


Parte 5. Trabajo con una base de datos en una aplicación de ASP.NET Core MVC

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 Rick Anderson y Jon P Smith.

El objeto MvcMovieContext 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 archivo Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

El sistema Configuración de ASP.NET Core lee la clave ConnectionString. Para el desarrollo local, obtiene la cadena de conexión del archivo appsettings.json :

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

Cuando la aplicación se implementa en un servidor de prueba o producción, se puede usar una variable de entorno para establecer la cadena de conexión en un servidor SQL Server de 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, instalada de forma predeterminada con Visual Studio.
  • Se inicia a petición mediante una cadena de conexión.
  • Está destinado al desarrollo de programas. Se ejecuta en modo de usuario, sin necesidad de una configuración compleja.
  • De forma predeterminada, crea archivos .mdf en el directorio C:/Usuarios/{user} .

Examen de la base de datos

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

Haga clic con el botón derecho en la tabla Movie (dbo.Movie) > Diseñador de vistas

Haga clic con el botón derecho en la tabla Movie > Diseñador de vistas.

Tabla Movie abierta en el diseñador

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

Haga clic con el botón derecho en la tabla MovieMovie.

Haga clic con el botón derecho en la tabla Movie > Ver datos.

Tabla Movie abierta mostrando datos de la tabla

Inicializar la base de datos

Cree una nueva clase denominada SeedData en la carpeta SeedData. Reemplace el código generado con el siguiente:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // 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;  // DB has been seeded.
}

Agregar el inicializador

Reemplace el contenido de Program.cs por el código siguiente. El nuevo código está resaltado.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/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.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Elimine todos los registros de la base de datos. Puede hacerlo con los vínculos de eliminación en el explorador o desde SSOX.

Probar la aplicación. Obligue a la aplicación a inicializarse; para ello, llame al código en el archivo Program.cs para que se ejecute el método de inicialización. Para forzar la inicialización, cierre la ventana del símbolo del sistema que Visual Studio abrió y reinicie presionando Ctrl+F5.

La aplicación muestra los datos inicializados.

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

El objeto MvcMovieContext 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 archivo Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

El sistema Configuración de ASP.NET Core lee la clave ConnectionString. Para el desarrollo local, obtiene la cadena de conexión del archivo appsettings.json :

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

Cuando la aplicación se implementa en un servidor de prueba o producción, se puede usar una variable de entorno para establecer la cadena de conexión en un servidor SQL Server de 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, instalada de forma predeterminada con Visual Studio.
  • Se inicia a petición mediante una cadena de conexión.
  • Está destinado al desarrollo de programas. Se ejecuta en modo de usuario, sin necesidad de una configuración compleja.
  • De forma predeterminada, crea archivos .mdf en el directorio C:/Usuarios/{user} .

Examen de la base de datos

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

Haga clic con el botón derecho en la tabla Movie (dbo.Movie) > Diseñador de vistas

Haga clic con el botón derecho en la tabla Movie > Diseñador de vistas.

Tabla Movie abierta en el diseñador

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

Haga clic con el botón derecho en la tabla MovieMovie.

Haga clic con el botón derecho en la tabla Movie > Ver datos.

Tabla Movie abierta mostrando datos de la tabla

Inicializar la base de datos

Cree una nueva clase denominada SeedData en la carpeta SeedData. Reemplace el código generado con el siguiente:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // 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;  // DB has been seeded.
}

<a name=snippet_"si">

Agregar el inicializador

Reemplace el contenido de Program.cs por el código siguiente. El nuevo código está resaltado.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/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.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Elimine todos los registros de la base de datos. Puede hacerlo con los vínculos de eliminación en el explorador o desde SSOX.

Probar la aplicación. Obligue a la aplicación a inicializarse; para ello, llame al código en el archivo Program.cs para que se ejecute el método de inicialización. Para forzar la inicialización, cierre la ventana del símbolo del sistema que Visual Studio abrió y reinicie presionando Ctrl+F5.

La aplicación muestra los datos inicializados.

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

El objeto MvcMovieContext 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 archivo Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

El sistema Configuración de ASP.NET Core lee la clave ConnectionString. Para el desarrollo local, obtiene la cadena de conexión del archivo appsettings.json :

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Cuando la aplicación se implementa en un servidor de prueba o producción, se puede usar una variable de entorno para establecer la cadena de conexión en un servidor SQL Server de 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, instalada de forma predeterminada con Visual Studio.
  • Se inicia a petición mediante una cadena de conexión.
  • Está destinado al desarrollo de programas. Se ejecuta en modo de usuario, sin necesidad de una configuración compleja.
  • De forma predeterminada, crea archivos .mdf en el directorio C:/Usuarios/{user} .

Inicializar la base de datos

Cree una nueva clase denominada SeedData en la carpeta SeedData. Reemplace el código generado con el siguiente:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // 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;  // DB has been seeded.
}

Agregar el inicializador

Reemplace el contenido de Program.cs por el código siguiente. El nuevo código está resaltado.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/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.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Elimine todos los registros de la base de datos. Puede hacerlo con los vínculos de eliminación en el explorador o desde SSOX.

Probar la aplicación. Obligue a la aplicación a inicializarse; para ello, llame al código en el archivo Program.cs para que se ejecute el método de inicialización. Para forzar la inicialización, cierre la ventana del símbolo del sistema que Visual Studio abrió y reinicie presionando Ctrl+F5.

La aplicación muestra los datos inicializados.

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

El objeto MvcMovieContext 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 del archivo Startup.cs:

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

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

El sistema Configuración de ASP.NET Core lee la clave ConnectionString. Para el desarrollo local, obtiene la cadena de conexión del archivo appsettings.json :

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Cuando la aplicación se implementa en un servidor de prueba o producción, se puede usar una variable de entorno para establecer la cadena de conexión en un servidor SQL Server de 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, instalada de forma predeterminada con Visual Studio.
  • Se inicia a petición mediante una cadena de conexión.
  • Está destinado al desarrollo de programas. Se ejecuta en modo de usuario, sin necesidad de una configuración compleja.
  • De forma predeterminada, crea archivos .mdf en el directorio C:/Usuarios/{user} .

Examen de la base de datos

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

Menú Ver

Haga clic con el botón derecho en la tabla MovieMovie.

Haga clic con el botón derecho en la tabla Movie (Película) > Diseñador de vistas

Tabla Movie abierta en el diseñador

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

Haga clic con el botón derecho en la tabla MovieMovie.

Haga clic con el botón derecho en la tabla Movie (Película) > Ver datos

Tabla Movie abierta mostrando datos de la tabla

Inicializar la base de datos

Cree una nueva clase denominada SeedData en la carpeta SeedData. Reemplace el código generado con el siguiente:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // 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;  // DB has been seeded.
}

Agregar el inicializador

Reemplace el contenido de Program.cs por el código siguiente:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MvcMovie.Data;
using MvcMovie.Models;
using System;

namespace MvcMovie
{
    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>();
                });
    }
}

Pruebe la aplicación.

Elimine todos los registros de la base de datos. Puede hacerlo con los vínculos de eliminación en el explorador o desde SSOX.

Obligue a la aplicación a inicializarse; para ello, 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. Puede hacerlo con cualquiera de los siguientes enfoques:

  • 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 VS en modo de no depuración, presione F5 para ejecutar en modo de depuración
    • Si está ejecutando VS en modo de depuración, detenga el depurador y presione F5

La aplicación muestra los datos inicializados.

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