Entity Framework Core y SqLite in-memory en ASP.NET Core
Seguramente en ciertas ocasiones, nos hemos visto en la necesidad de desarrollar una aplicación con acceso a datos, y por las razones que fueran, no hemos podido disponer de una Base de Datos real sobre la cual trabajar durante el proceso de desarrollo.
Para este tipo de eventualidades, el ORM Entity Framework Core, nos proporciona una forma muy sencilla de implementar un sistema de persistencia en memoria (in-memory) totalmente operativo, funcional y ligero, basado en el motor de Bases de Datos relacionales SqLite.
En este Post, veremos como implementar una Base de Datos SqLite en memoria, desde un proyecto ASP.NET Core MVC.
Creando el proyecto
Para este ejemplo, utilizaremos Visual Studio 2017 para crear un nuevo proyecto Web MVC, con plataforma de destino .NET Core y el framework ASP.NET Core 2.2.
Por defecto, el proyecto debe tener ya referenciados los paquetes NuGet para Entity Framework Core en la sección Dependencias/NuGet, dentro del paquete Microsoft.AspNetCore.App (2.2.0)
.
A continuación, instalaremos el paquete NuGet Microsoft.EntityFrameworkCore.Sqlite desde la consola de administración de paquetes: Herramientas > Administrador de paquetes NuGet > Consola del Administrador de paquetes.
PM> Install-Package Microsoft.EntityFrameworkCore.Sqlite -Version 2.2.3
El contexto de datos
Ahora crearemos la clase ApplicationDbContext.cs
que será la encargada de gestionar el contexto de datos de Entity Framework Core.
Esta clase deberá de heredar de Microsoft.EntityFrameworkCore.DbContext
, y recibirá a través de su constructor, las opciones de configuración para el DbContext
.
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
// COMPRUEBA QUE LA BD ESTÁ CREADA Y SI NO LA CREA.
Database.EnsureCreated();
}
public DbSet<PaisViewModel> Paises { get; set; }
}
Importante: Es necesario que el esquema de la Base de Datos sea creado en memoria a la hora de instanciar el contexto de datos. Esto lo hacemos mediante el método
EnsureCreated()
de la propiedadDataBase
en el constructor de la claseApplicationDbContext
.
Como vemos, también hemos definido una propiedad del tipo DbSet<T>
, que definirá el modelo de datos con el que vamos a trabajar, en este caso será PaisViewModel.cs
.
public class PaisViewModel
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(50, MinimumLength = 3)]
public string Nombre { get; set; }
public int Habitantes { get; set; }
}
Registrando el DbContext como servicio
Por último, solo nos quedaría registrar el contexto de datos ApplicationDbContext.cs
como servicio, en el método ConfigureServices(IServiceCollection services)
de la clase Startup.cs
.
La particularidad en este caso, es que debemos definir un objeto del tipo SqliteConnection
, con un connectionString
del tipo "DataSource=:memory:"
(Base de Datos en memoria).
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// CONFIGURACION DE SQLITE IN-MEMORY
var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlite(connection));
}
Importante: Una vez creado el objeto
connection
, es necesario llamar a su métodoOpen()
, para abrir la conexión.
Consideraciones finales
Una vez llegados a este punto, ya podemos utilizar nuestra Base de Datos SqLite en memoria, a través de una instancia del contexto de datos ApplicationDbContext
.
Como ya hemos registrado el DbContext como servicio, podremos obtener una instancia del mismo mediante inyección de dependencias, por ejemplo, en cualquier Controlador de nuestra aplicación ASP.NET Core MVC.
public class PaisController : Controller
{
private readonly ApplicationDbContext _dbContext;
public PaisController(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
// ...
}
Nuevo comentario
Comentarios
No hay comentarios para este Post.