ASP.NET 5 con SQLite, Entity Framework 7 y Angularjs 1

En este artículo se muestra cómo utilizar SQLite con ASP.NET 5 (versión rc1-final) utilizando Entity Framework 7 y como frontend Angularjs 1 (que además utiliza Sass para las CSS).

Utilizaremos Visual Studio Code con Mac OS para estudiar cómo se desarrolla .NET en este SO y así disfrutar de la gran novedad de ASPNET 5: ser multiplataforma. No obstante, el código que aporto también se puede testear en Windows, de ahí que el repositorio de github incluya el archivo de la solución y proyecto.

El código

https://github.com/dactivo/AspNet5SQLite

¿Por qué SQLite?

Principalmente porque con Mac OS localmente no podemos utilizar SQL SERVER.

Y además para utilizar lo último que incluye EF7: ahora se pueden crear bases de datos SQLite utilizando migraciones Entity Framework que no era posible en las versiones anteriores.

Instalación de ASPNET 5

No es el objeto de este artículo, para cualquier duda dirígite a la fuente por antonomasia:

http://docs.asp.net/en/latest/getting-started/installing-on-mac.html

Creación del proyecto

Utilizamos Omnisharp generator-aspnet para generar un proyecto Web Application, y lo hacemos así:

yo aspnet

Project.json

Hemos realizado muchas modificaciones a dicho proyecto para añadir EF 7, lo podéis visualizar en el código, pero principalmente, tendremos que asegurarnos que tenemos las dependencias necesarias en el archivo project.json.

Esta es la parte más difícil, ya que tienes que averiguar qué paquetes son obligatorios, algo más sencillo con Visual Studio 2015, y eso que afortunadamente es de destacar la ayuda de "IntelliSense"(autocompletado) en el archivo project.json que implementa Visual Studio Code.

En cualquier caso, aseguraros que constan los siguientes paquetes:

"EntityFramework.Commands": "7.0.0-rc1-final",
"EntityFramework.SQLite": "7.0.0-rc1-final",

También añadiremos el siguiente comando a "commands", esto ya explicaremos por qué.

"commands": {
"web": "Microsoft.AspNet.Server.Kestrel",
"ef": "EntityFramework.Commands"
},

El modelo

Vamos a implementar un modelo/objeto POCO (se llaman así como abreviatura de "plain-old" CLR objects, objetos sencillos que se implementan con DbContext, no con ObjectContext por defecto en Visual Studio 2010 ) muy básico donde simplemente añadiremos líneas de registros con un nombre y algún detalle más.

public class DataEventRecord
{
[ScaffoldColumn(true)]
public long Id { get; set; }
public string Name { get; set; }

public string Description { get; set; }

public DateTime Timestamp { get; set; }
}

Y definimos el contexto con un solo DbSet y le indicamos la primary key en el método OnModelCreating:

public class DataEventRecordContext : DbContext
{
public DbSet<DataEventRecord> DataEventRecords { get; set; }

protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<DataEventRecord>().HasKey(m => m.Id);
base.OnModelCreating(builder);
}
}

Startup.cs

Ahora debemos añadir el servicio de Entity Framework y el proveedor de SQLite, así como el path de la base de datos, que definimos en el archivo appsettings.json.

var connection = Configuration["Production:SqliteConnectionString"];
services.AddEntityFramework()
.AddSqlite()
.AddDbContext<DataEventRecordContext>(options => options.UseSqlite(connection));

Migraciones

Hemos creado nuestra entidad DataEventRecord con Code First, y aún no las hemos transformado en base de datos, así que necesitamos crearla, a través de Visual Studio es más sencillo, aquí utilizaremos el terminal con las siguientes instrucciones.

dnx ef migrations add testMigration
dnx ef database update

Esto creará una carpeta en la raíz de src llamada Migrations con las clases que necesitamos para la creación de la base de datos. Podéis abrir la base de datos generada en nuestro caso: dataeventrecords.sqlite, con SQLite Manager en Firefox o con sqllitebrowser.app.

Hay que tener en cuenta que aunque podamos crear base de datos con Code First con SQLite, la actualización de la base de datos sin volver a partir de cero no es viable, si en SQL Server las actualizaciones pueden ser incrementales, en SQLite no.

Observad la siguiente imagen resumen de las modificaciones posibles una vez creada la base de datos:

Creación de Repositorio / Controlador

Básicamente hemos creado un servicio o repositorio que se encarga de realizar las operaciones CRUD relacionadas con nuestro modelo, a través de la clase DataEventRecordRepository que implementa el interfaz IDataEventRecordRepository (ver el código en github).

Inyectaremos este servicio a través de Inyección de Dependencias (DI), que como novedad implementa .NET por defecto, y no tenemos que recurrir a librerías como Unity o Ninject, en el método ConfigureServices del archivo Startup.cs:

services.AddScoped<IDataEventRecordRepository, DataEventRecordRepository>();

Utilizamos AddScoped que normalmente es lo más óptimo, porque solo crea el objeto inyectado una vez ante múltiples inyecciones de dependencia, si quisiéramos crear un objeto cada vez que se inyecta la clase, utilizaríamos AddTransient.

Para ahondar más sobre las posibilidades, una lectura fácil y bien testeada:

http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/

Montando el proyecto angularjs 1

Una vez descargado el proyecto, para montar todos los archivos estáticos que utilizamos con la aplicación angularjs, utilizaremos grunt.

npm install
grunt bowertask
grunt default

En Windows Visual Studio 2015 no harían falta las 2 primeras líneas es decir, la instalación de Node y la línea de "bowertask" (con la que se bajan las dependencias en bower) porque VS automatiza este proceso cuando cargamos el proyecto o modificamos el archivo bower.json.

Básicamente concatenamos los archivos js, compilamos Sass etc... de los que depende el proyecto, y además implementamos un watch para "reconcatenar" todos los archivos según vamos realizando modificaciones en Sass y angular.

Como compilamos Sass, también necesitaremos tener instalado Ruby y Sass. Para comprobar si tenemos ruby instalado, escribiremos en el terminal

ruby -v

Si no, en internet encontrarás muchos recursos y siempre comprueba que está incluido en el path.

Para instalar el compilador, escribiremos:

gem install sass

Ejecutando el proyecto

Ya solo quedaría ejecutar los comandos habituales:

dnu restore
dnu build
dnx web

Y acceder a la web con la dirección (cambiar el puerto si hiciera falta):

http://localhost:5000/index.html

En Windows Visual Studio 2015 nos hace la vida más sencilla y la restauración de las librerías se produce automáticamente a cada modificación del archivo project.json o al cargar el proyecto de VS. El despliegue de la web con el servidor dnx (.NET Execution Environment, es un servidor común a los 3 sistemas operativos, Windows, Linux y Mac), lo efectuaríamos solo pulsando en el botón de depurar "web" en lugar de IIS Express.

Conclusión

Es sencillo montar una web en ASP.NET 5 y usando EF 7 una vez te familiarizas con los comandos dnx específicos, y donde más podemos "bloquearnos" es buscando las librerías donde se encuentran ciertas clases y cómo implementar los servicios que necesitamos con ASP.NET 5.

Entity Framework funciona fácilmente en Mac OS, es viable al menos, que merezca la pena utilizar Mac OS en vez de Windows, eso es otra cosa, dado que la plataforma aún tiene limitaciones.

Referencias

http://damienbod.com/2015/08/30/asp-net-5-with-sqlite-and-entity-framework-7/

https://github.com/dactivo/AspNet5SQLite/tree/master/src/AspNet5SQLite

Escrito el 16 ene 2016
comments powered by Disqus

« Angular 2 beta, diferencias de código con la versión Alpha 48 -