Entity Framework Core con Xamarin.Forms: SQLite de manera sencilla

Luis Beltran

Microsoft MVP | Xamarin Certified Mobile Developer | Estudiante en Universidad Tomás Bata en Zlín, República Checa | Docente en Instituto Tecnológico de Celaya, México | Soy fan de el Atlético de Madrid, el América, la selección de Italia, la música de Katie Melua y los videojuegos | Me gusta viajar

Podría también gustarte...

7 Respuestas

  1. Abigail dice:

    Hola! que tal de rendimiento da sql lite con entity framework, aunque mejoro mucho el entity framework, me parece que aun el pasar las querys a sql genera codigo de mas no muy optimo, espero la parte de personalizar los metodos para agregar nuevos metodos, tambien una duda que he tenido es sobre como actualizar la base de datos una vez que ya tienes usuarios utilizando tu aplicacion y quieres agregar nuevas tablas, hacer un update a tus tablas como parte de la actualizacion como se hace eso? es algo parecido a las migraciones del entityframework? esto se puede automatizar tambien o es ejecutar scripts al inicio de tu aplicacion segun la version de tu base de datos con la del disposivo?

    • Luis Beltran dice:

      ¡Hola qué tal, Abigail! Muchas gracias por tu comentario e interesantes preguntas. Voy a responderlas una a una en los siguientes comentarios, pues da mucho de qué hablar.

      En primer lugar, lo que comentas de la generación de código al utilizar un ORM (como EF o NHibernate por ejemplo) es cierto, siempre dependemos de cómo el ORM analiza la instrucción que se le envía para generar el código SQL respectivo, y va a haber ocasiones en que se podría simplificar para optimizarlo. Afortunadamente, en este caso EF Core nos provee de mecanismos para abordar la situación si encontramos que el desempeño no es el ideal. Investigando encontré mucho material interesante que creo que abordaré en una publicación, pues vale la pena hablar al respecto :).

      Pero a grandes rasgos, primero podemos utilizar el código mostrado en este enlace para crear un log de las operaciones donde se involucra la base de datos. Lo probé y funciona (con unas ligeras modificaciones). La única desventaja es que DbCommandLogData está obsoleto, así que en alguna futura actualización puede ser removido. Otro código que encontré (pero no he revisado) es el mostrado en este blog. Lo único malo es que usa Reflection, por lo que hay muchas dependencias y, como menciona el autor, puede romperse en alguna actualización de EF Core. Esta otra mejora no lo he probado aún pero se ve interesante.

      Una vez que llevamos un registro de las consultas generadas, podemos analizar si son óptimas o no. Alguien ya hizo una prueba de insertar alrededor de 400,000 registros y encontró que, es un proceso lento utilizar EF Core. Sin embargo, para optimizar la inserción de tal cantidad de registros se puede seguir la recomendación que le proporcionaron, donde el punto clave es reutilizar el mismo comando especificándolo en el CommandText (tiene lógica, si vas a utilizar de forma masiva una instrucción, lo mejor es evitar que EF Core/SQLite la genere una y otra vez). Incluir varias operaciones en una sola transacción por supuesto que ayuda también (pues por defecto, cada operación es una transacción, implicando que lleva su tiempo crear la transacción y la instrucción que se ejecutará). De este modo, una sola transacción para varias operaciones. Lo del desactivar la sincronización como sugieren en el blog no lo he probado, como mencionan tiene sus riesgos, sería cosa de ver cuál es la ganancia y la pérdida ahí, así como analizar si se obtiene una mejora significativa o no.

      De hecho, especificar el código SQL a ejecutar es una buena idea si detectamos que el código generado por el ORM no es el óptimo. En ese sentido, la documentación oficial provee de ejemplos y buenas prácticas que podemos seguir (por ejemplo, lo de las consultas parametrizadas, para evitar inyección de código). En ese mismo enlace puedes observar que hay ciertas limitantes también con respecto al uso de SQL queries insertadas.

      Por último, en la documentación oficial mencionan cómo optimizar el uso de EF Core.

      Como puedes ver, considero que determinar si EF Core brinda beneficios de rendimiento es una tarea adicional pero que tenemos las herramientas necesarias tanto para medirlo como para optimizarlo. Creo que depende de qué tan complejas sean nuestras instrucciones 🙂

    • Luis Beltran dice:

      Al respecto de la segunda cuestión (personalizar los métodos), ¡claro que sí! La próxima semana (martes o miércoles) cuenta con la publicación 🙂 En parte ya está avanzado el trabajo porque ya marcamos los métodos de clase como virtuales, así que perfectamente podemos crear una clase que herede de ServicioBaseDatos (especificando la clase, por ejemplo ServicioBaseDatos) para agregar solo alumnos que estén en un rango de edades (por decir algo). Y en dicha clase, podemos crear algún nuevo método específico (búsquedas es lo típico).

    • Luis Beltran dice:

      Finalmente, la actualización de tablas es un escenario bastante común (ya ves que “casi nunca” cambian los requerimientos jaja) y considero necesario hablar de ello también en la siguiente entrada, así que gracias por la idea je.

      Así es, se utilizan migraciones en tiempo de ejecución. Se puede automatizar sin problemas, esta guía se ve buena para comenzar.

      Cabe mencionar que sxisten algunas limitaciones, por ejemplo, no se puede agregar una llave foránea o primaria, o renombrar columnas. Pero como menciona el artículo mismo, dicho problema no es tanto de EF Core sino del motor de SQLite. Se pueden resolver mediante scripts SQL, tal como lo ilustra perfectamente este blog, donde explican cómo renombrar una columna.

      Para ser honesto, no me había fijado (o no recordaba) pero en el blog de Xamarin ya habían hablado de EF Core e incluso explican la parte de las Migrations, así que también sirve lo que mencionan.

      Interesantes preguntas, cualquier duda al respecto me comentas =)

      ¡Saludos!

  2. Jesús Mendoza dice:

    Hola profesor, algunos tuvimos el privilegio de ser su alumno, quiero agradecer su conocimiento y espero la segunda parte, justo ahora estoy en Colombia, pero pronto vuelvo a México, espero verlo pronto! Muchas gracias, saludos!

    • Luis Beltran dice:

      ¡Jesús! Gracias por tu visita al blog, un gusto encontrarte por estos rumbos. Muchas gracias también por tus comentarios, si recuerdo a tu grupo, fue el último al que me tocó darle clase antes de iniciar esta aventura europea jeje. Me da mucho gusto saber que estás en Colombia, seguramente es una experiencia enriquecedora en todos los sentidos. Aprovéchala y disfrútala mucho, pues viajar y conocer nuevas personas, culturas, contextos nos brinda un conocimiento único en muchos aspectos. Felicidades por el logro y claro que sí, cuando esté en México te lo haré saber. De igual forma, si un día visitas Europa, házmelo saber y por acá nos vemos también =D. ¡Un saludo y que sigan los éxitos, Jesús!

      ¡Y claro, la segunda parte la publicaré a más tardar el miércoles! =D

  3. Jhonatan Moises dice:

    Hola …..Muy bueno el aporte 🙂 muchísimas gracias…en verdad busque mucho pero mucho ….hacer base de datos en Xamarin…y es el unico que funciono..un poco extenso ..pero bueno :….Gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Follow on Feedly