martes, 9 de enero de 2018

SQLite Entity Framework en Visual Studio 2017 Community

Recién quise utilizar SQLite con Entity Framework en Visual Studio 2017 y me encontré con que no había paquete de instalación específico para esta versión de Visual Studio y que además, en uno de los hilos del foro de SQLITE el usuario mistchkin indica que parece ser que no creará un paquete de soporte (link al hilo).

Sin embargo, rebuscando en la web, específicamente en StackOverflow, alguien comenta que sí es posible, utilizar SQLite con Entity Framework en Visual Studio 2017. Después de seguir esta guía y fallar miserablemente debido a un tema con la versión específica a utilizar del Entity Framework decidí anotar los pasos, de manera que aquí los tienes desglosados para que te ahorres las horas (y los cabellos) que a mí me costó averiguar el escenario completo.

Nota: Estos pasos son para proyectos tipo "Database First" ya que las herramientas (incluso las oficiales por parte de SQLite) para esta versión no soportan proyectos tipo "Code First"



Instalar el SqlCeToolbox del usuario de Github ErikEJ

Link al instalador de la extensión , Link a las release notes de la extensión (por si quieres un poco más de información acerca del asunto).

Esto agrega una herramienta al menú "Herramientas" en el IDE

El cual es una herramienta para crear/consultar bases de datos SQLite y SQL Server. Lo importante aquí es que la herramienta aparezca en el IDE y que al pulsar el botón de "?" aparezca la línea "SQLite EF6 DbProvider in GAC - Yes" ya que ello indica que la dll de SQLite se encuentra en el GAC y que la herramienta para poder utilizarla en modo "Database First" fue correctamente instalada.



Instalar el SQLite en la GAC

Debes instalar el paquete "sqlite-netFx46-setup-bundle-x86-2015-1.0.106.0.exe" que puedes encontrar en los downloads de SQLite. Aquí debes tomar en cuenta lo siguiente: netFx46 indica la versión del framework, así que este se refiere al framework 4.6 de .NET, bundle-x86-2015 se refiere a la arquitectura y versión de visual studio mientras que 1.0.106.0 se refiere a la versión del SQLite. Seguro te preguntarás "y si esto es para VS.NET 2017 ¿porqué voy a instalar algo para VS.NET 2015?" y mi respuesta es: estando en este negocio nada debería sorprenderte ya ;)  pero créeme, así es como va a funcionar. Mi otra respuesta sería: ni busques el paquete para VS.NET 2017 porque por lo menos hasta el momento de escribir este artículo, dicho paquete no existe.

Selecciona "Full Installation" y marca todas las opciones en la siguiente pantalla (ver imágenes a continuación)




Compilar para .NET Framework 4.6

Este paso en ocasiones no es necesario pero solo "por si las moscas", es mejor utilizar el framework 4.6 de .NET.  Para lograrlo, es necesario ir las propiedades de tu proyecto y luego cambiar el "Target Framework" a 4.6





Instalar en tu proyecto las librerías de Entity Framework

Puedes utilizar el NuGet package manager para esto pero cuida de seleccionar la versión versión 6.1.3, ya que debido a un cambio en el Entity Framework en la versión 6.2, las librerías de SQLite versión 1.0.106.0 generan un error que impide al IDE ayudarte a crear las clases para un proyecto "Database First"



Instalar en tu proyecto los paquetes necesarios de SQLite

Los paquetes/dll son los siguientes:
  • System.Data.SQLite
  • System.Data.SQLite.Core
  • System.Data.SQLite.EF6
  • System.Data.SQLite.Linq

Selecciona la versión 1.0.106.0. Si utilizas el NuGet, basta con instalar System.Data.SQLite ya que se instalarán automátciamente los demás debido a las dependencias. Y cuidado, la versión de estas DLL deben ser LA MISMA que la del paso anterior: 1.0.106.0, de lo contrario, el entorno, ya sea en tiempo de compilación o de ejecución, te podría dar un error indicando que no encuentra las librerías.


Verifica tu archivo App.config

En la sección "entityframework" deberán existir estas entradas en "providers"

    <providers>
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>


y en system.data deberán aparecer las siguientes líneas DbProviderFactories

    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>


Estas líneas son necesarias para indicarle al .NET cuáles son las dll/clases para conexión con SQLite y con SQLite mediante Entity Framework.

Compila tu proyecto

En ocasiones no es necesario pero lo más seguro es compilarlo y listo, de lo contrario... podría ser que necesites regresar a compilarlo así que ahorrate problemas antes de ejecutar el siguiente paso y simplemente presiona Ctrl+Shift+B para compilar y listo.

Ejecuta el Entity Data Model Wizard

En este punto ya puedes usar el Entity Data Model Wizard para crear el "contexto" y las clases de acceso a  la base de datos.

Añade un nuevo elemento "ADO.NET Entity Data Model"

Selecciona "EF Designer from Database" para tener un proyecto tipo "Database First"
 Selecciona el "SQLite Provider (Simple for EF6 by ErikEJ)", en efecto, esto es lo que instalaste en el primer paso.

 
Al elegir la base a la cual conectarte, en la propiedad "Data Source" deberás indicar la ruta del archivo de base de datos SQLite que probablemente ya tienes creado.

 Luego de ello podrás seleccionar las tablas a añadir a tu modelo.
 Y ¡voilá!, las tablas están tu diagrama y las clases de contexto y clases modelo de clase están en el "Explorador de Solución"


Espero que este artículo te haya sido de ayuda. Si te surge algún error no cubierto en esta guía no dudes en dejarme un comentario.