Entity Framework 6 y Sql Server Compact CE en ASP.NET MVC 5

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 un servidor de bases de datos real sobre el cual trabajar durante el proceso de desarrollo.

Para este tipo de eventualidades, la base de datos Sql Server Compact CE en conjunción con el ORM Entity Framework, nos proporciona una forma muy sencilla de implementar un sistema de persistencia integrado en el proyecto (App_Data) totalmente operativo, ligero, compacto y funcional.

En este Post, veremos como implementar una Base de Datos Sql Server Compact 4.0 gestionada a través de Entity Framework 6, en un proyecto ASP.NET MVC 5.

Creando el proyecto

Para este ejemplo, utilizaremos Visual Studio 2017 para crear un nuevo proyecto Web MVC, con plataforma de destino .NET Framework 4.6.1 (>= 4.5).

proyecto asp net mvc 5

Instalando Sql Server Compact

A continuación instalaremos Sql Server Compact 4.0, a través del paquete NuGet Microsoft.SqlServer.Compact. Para ello abriremos la consola de administración de paquetes NeGet (Herramientas > Administrador de paquetes NuGet > Consola del Administrador de paquetes) y ejecutaremos el siguiente comando:

PM> Install-Package Microsoft.SqlServer.Compact -Version 4.0.8876.1

Una vez instalado el paquete, observaremos que en el proyecto se ha creado una nueva carpeta _bin_deployableAssemblies, donde se encuentran las librerías del motor de base de datos Sql Server Compact.

sql-server-ce-dlls

Instalando Entity Framework

Una vez instalado el motor de base de datos en nuestro proyecto, procederemos a instalar el ORM Entity Framework 6

Desde la consola de administración de paquetes NuGet, ejecutaremos los siguientes comandos:

PM> Install-Package EntityFramework -Version 6.2.0
...
...
PM> Install-Package EntityFramework.SqlServerCompact -Version 6.2.0

El contexto de datos

Ahora crearemos la clase ApplicationDbContext.cs que será la encargada de gestionar el contexto de datos de Entity Framework. 

Esta clase deberá de heredar de System.Data.Entity.DbContext, y llamará al constructor de su clase base (DbContext) con el nombre de la cadena de conexión a la base da datos Sql Server Compact.

    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext() : base("DatabaseConnection")
        {
        }

        public DbSet<PaisViewModel> Paises { get; set; }

        // ...
    }

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; }
    }

La cadena de conexión

En el archivo Web.config del proyecto, definiremos la cadena de conexión hacia la base de datos de la siguiente manera:

  <connectionStrings>
    <add name="DatabaseConnection" connectionString="Data Source=|DataDirectory|db.sdf;" 
         providerName="System.Data.SqlServerCE.4.0" />
  </connectionStrings>

Importante: Cabe destacar que el origen de datos (Data Source=) lo hemos definido utilizando la notación "|DataDirectory|" que hace referencia al la carpeta App_Data de nuestro proyecto web, más "db.sdf" que será el nombre de la base de datos.

Creando la base de datos

Llegados a este punto, ya podemos crear físicamente la base de datos en nuestro proyecto. Esto lo haremos mediante migraciones de Entity Framework, a través de comandos Code First desde la consola de administración de paquetes NuGet.

Habilitando las migraciones

En primer lugar, habilitaremos las migraciones en nuestro proyecto, mediante el siguiente comando:

PM> Enable-Migrations -force

Una vez finalizada con éxito la ejecución del comando, podemos ver como se ha creado una nueva carpeta Migrations con una clase de configuración Configuration.cs en nuestro proyecto.

migrations-folder

Creando la migración Inicial

Seguidamente, crearemos la primera migración (de nombre "Inicial") hacia la base de datos, mediante el siguiente comando:

PM> Add-Migration Inicial

La correcta ejecución de este comando, creará en la carpeta Migrations un nuevo archivo de migración del tipo 201904132056412_Inicial.cs.

migracion-inicial

Este archivo o clase de migración, contendrá básicamente los métodos para crear (Up()) o deshacer (Down()) los últimos cambios del Modelo de datos, sobre la base de datos en la que estemos trabajando (en este caso Sql Server Compact).

    public partial class Inicial : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.PaisViewModels",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Nombre = c.String(nullable: false, maxLength: 50),
                        Habitantes = c.Int(nullable: false),
                    })
                .PrimaryKey(t => t.Id);
            
        }
        
        public override void Down()
        {
            DropTable("dbo.PaisViewModels");
        }
    }

Aplicando la migración Inicial

Por último, solo quedaría aplicar las modificaciones de la migración Inicial a la base de datos Sql Server Compact. 

Eso lo haremos mediante el siguiente comando:

PM> Update-Database

Importante: El comando Update-Database, no solo aplica los cambios de las migraciones pendientes (en nuestro caso sólo la "Inicial") hacia la base de datos, sino que además comprueba si la base de datos existe, y si no es así, la crea según el Data Source indicado en la cadena de conexión.

En este punto, y si todo ha ido bien, ya tendremos creada nuestra base de datos Sql Server Compact en nuestro proyecto web ASP.NET MVC 5.

Como ya comentamos anteriormente, la base de datos se creará en la carpeta App_Data, con el nombre que indicamos en la propiedad Data Source de la cadena de conexión.

appdata-base-datos

Consideraciones finales

Una vez llegados a este punto, ya podemos utilizar nuestra base de datos Sql Server Compact a través de una instancia del contexto de datos ApplicationDbContext.

Como ejemplo, y para probar nuestro proyecto, podemos crear el Controlador PaisController.cs con la siguiente estructura:

    public class PaisController : Controller
    {
        private ApplicationDbContext _dbContext;

        // GET: Pais/List
        public ActionResult List()
        {
            using (_dbContext = new ApplicationDbContext())
            {
                _dbContext.Paises.Add(new PaisViewModel()
                {
                    Id = 1,
                    Nombre = "España",
                    Habitantes = 1000000
                });
                _dbContext.SaveChanges();
                return View(_dbContext.Paises.ToList());
            }            
        }
     }

Nota: Por supuesto, no olvidar crear la Vista asociada List.cshtml.

Posiblemente, también nos interese disponer de alguna herramienta que nos permita administrar y gestionar nuestra base de datos integrada Sql Server Compact. Para estos cometidos, disponemos de la extensión para Visual Studio SQLite/SQL Server Compact Toolbox.

Una vez instalado este complemento, podemos acceder a la interfaz de administración, a través de Herramientas > SQLite/SQL Server Compact Toolbox.

compact-toolbox

 

  Compartir


  Nuevo comentario

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

Enviando ...

  Comentarios

No hay comentarios para este Post.



  Etiquetas

.NET Core .NET Framework .NET MVC .NET Standard AJAX ASP.NET ASP.NET Core ASP.NET MVC Bootstrap Buenas prácticas C# Cookies Entity Framework JavaScript jQuery JSON PDF Pruebas Unitarias Seguridad SEO Sql Server SqLite Swagger Validación Web API Web Forms

  Nuevos


  Populares















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