Trabajando con SQL LocalDB en ASP.NET Core MVC

El objeto MvcMovieContext maneja toda la tarea de conectar a la base de datos y mapear los objetos Movie a los registros de la base de datos. El contexto de base de datos está registrado con el contenedor de inyección de dependencias en el método ConfigureServices en el archivo Startup.cs.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

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

El sistema de Configuración de ASP.NET Core lee la ConnectionString. Para desarrollar de manera local, obtiene la información del archivo appsettings.json.

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

Cuando desplegamos la app a un servidor de producción o de prueba, podemos utilizar una variable de entorno o cualquier otro método para configurar la cadena de conexión a un servidor SQL Server real o una base de datos SQL Azure en la nube. Ver “Configuration” para más información.

SQL Server Express LocalDB

LocalDB es una versión liviana del motor de base de datos SQL Server Express que está hecha para el desarrollo de software. LocalDB se inicia bajo demanda, solo cuando estamos desarrollando o probando por lo que no nos va a ocupar memoria y no hay configuraciones complejas. Por defecto, LocalDB crea archivos “*.mdf” en el directorio C:/Users/[usuario].

  • Del menú de Ver, abrimos el Explorador de Objetos de Sql Server

Imagen del explorador de objetos sql en el menú

  • Hacemos click derecho en la tabla Movie > Ver diseñador

Opcion ver el diseñador

Diseño de la tabla

Notemos el ícono de llave junto al Id. Por defecto, EF hace que la propiedad que se llame Id sea la clave primaria.

  • Hagamos click derecho en la tabla Movie > Ver datos

Opción ViewData

Datos de la tabla

Sembrar la base de datos

Sembrar la base de datos es llenarla con datos de inicialización.

Creemos una clase llamada SeedData en la carpeta Models. Reemplacemos el código generado con el siguiente:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
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-1-11"),
                         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, el inicializador de semilla retorna y no se agrega ninguna película.

if (context.Movie.Any())
{
    return;   // DB has been seeded.
}

Agreguemos el inicializador de la semilla

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

namespace MvcMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateWebHostBuilder(args).Build();

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

                try
                {
                    var context = services.GetRequiredService<MvcMovieContext>();
                    context.Database.Migrate();
                    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 IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

Probemos la aplicación

  • Borremos todos los registros de la base de datos. Podemos hacer esto con los links de borrar en el navegador o usando el Explorador de Objetos de Sql Server.
  • Forcemos a la app para que se inicialice (lo que significa llamar a los métodos en la clase Startup) para que el método se ejecute. Para esto debemos detener IIS Express y reiniciarlo. Podemos hacerlo de las siguientes maneras.

Ícono de IIS Express

Opción detener IIS Express

  • Si estuvimos ejecutando VS en modo sin depurar, presionamos F5 para ejecutar en modo depuración.
  • Si estuvimos ejecutando VS en modo depuración, detengamos el depurador y presionemos F5.

La app muestra los datos de la semilla.

Datos de la semilla

Vamos a ver como trabajan los controladores junto con las vistas para modificar los datos en la siguiente parte del tutorial.