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.

proyecto-asp-net-core

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

nuget-ef-core

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 propiedad DataBase en el constructor de la clase ApplicationDbContext

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étodo Open(), 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;
        }

        // ...

    }

 

  Compartir


  Nuevo comentario

El campo Comentario es obligatorio.
El campo Nombre es obligatorio.

  Comentarios

No hay comentarios para este Post.



Utilizamos cookies propias y de terceros para mejorar nuestros servicios y ofrecerle una mejor experiencia de navegación. Si continúa navegando consideramos que acepta su uso. Más información   Acepto