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
- Hacemos click derecho en la tabla
Movie
> Ver diseñador
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
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.
- 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.
Vamos a ver como trabajan los controladores junto con las vistas para modificar los datos en la siguiente parte del tutorial.