19/04/2013 Entity Framework 6 Jorge Bustos | [email protected], Servicios Profesionales [email protected] | www.danysoft.com 18.04.2013 Entity Framework 6 ¿Para qué sirve? 1 19/04/2013 Entity Framework Es una abstracción que representa un almacén de datos (no sólo SQL Server o SQL Server CE) El almacén de datos es un contexto que contiene – Colecciones de objetos (representan filas de tablas) – Relaciones entre objetos (propiedades de navegación) Flujos de trabajo con EF Model First Code First (nueva BD) D t b Database Fi t First C d First Code Fi t (BD existente) i t t ) • Crear modelo en • Define clases y mapeo en diseñador código • BD creada desde modelo • BD creada desde el modelo • Clases auto-generadas • Usar Migrations para cambiar desde modelo BD • Ingeniería inversa de BD a modelo • Clases auto-generadas desde modelo • Usar herramientas de ingeniería inversa • Mapeo y clases definidos en código 2 19/04/2013 Ejemplo de modelo Ejemplo de Code First Fluent API 3 19/04/2013 Ejemplo de Code First Clave Relación Atributos Convencion es Trabajar con Entity Framework Descargar paquete NuGet de EF Crear modelo (EDM o Code First) Instanciar el contexto (derivado del modelo) Se trabaja con LINQ a Entidades Llamar a SaveChanges Resultado: no hay que escribir sentencias SQL 4 19/04/2013 Ejemplito de código de EF Leer Guardar Code First Migrations Permiten aplicar los cambios de las clases Code First a la base de datos Acepta Upgrade y Downgrade Pueden ser manuales o automáticas (depende del inicializador de BD) Se puede usar migrate.exe pueden p personalizar p para añadir otras Desde EF6 se p “artefactos” a la BD, sin utilizar T-SQL 5 19/04/2013 Ejemplo de Code First Migrations Ejemplo de Code First Migrations 6 19/04/2013 Sincronizar BD con EDM Update Model Update Database Al trabajar con modelos se pueden aplicar los cambios a la BD Los cambios de la DB pueden actualizar el modelo Normalmente la BD de desarrollo no es la de producción Usar otras herramientas como SSDT o la que se desee Miedos a EF 1. No puedo ejecutar mis propias sentencias – DbContext.SqlQuery/SqlQuery<T> – Database.ExecuteSqlCommand 2 T 2. Tarda d mucho h en arrancar y en ejecutar j t consultas lt – generación de vistas más rápida – vistas pregeneradas (con EF Power Tools) – Mejora de cachés y otras optimizaciones de consultas 3 No puedo utilizar procedimientos almacenados 3. – Mapeo de procedimientos de DB a funciones C# en el modelo – Mapeo de Update, Insert, Delete en modelo POCO 7 19/04/2013 Más miedos a EF 4. Las consultas generadas no son óptimas – Van mejorando – Si la estructura de BD es demasiado compleja, usar procedimientos – Se pueden usar procedimientos almacenados – La mayoría de las consultas son CRUD triviales 5. Difícil de coordinar el modelo con la BD – Database First y Model First soportan Update from M d l y Update Model U d t Database D t b – POCO soporta migraciones manuales o automáticas Y más miedos a EF 6. Falta de control sobre entidades relacionadas – Se puede hacer un mapeo preciso con Fluent API de q tipo p de relación caulquier – Se soportan las acciones en cascada a nivel de modelo y a nivel de BD 7. El modelo de programación es complejo – En EF 4.0 se creó DbContext evitando complejidades de ObjectContext – POCO puede mantenerse con clases parciales e ingeniería inversa 8 19/04/2013 Otro miedo: Gestión de entidades relacionadas La carga de entidades relacionadas soporta varias modalidades: – Carga diligente (eager loading) • Carga hijos al cargar el padre – Carga diferida (lazy loading) • Carga hijos cuando va a accederse a ellos – Carga explícita (explicit loading) • Carga g de la lista p por código g – Consultas con proyecciones • Carga con LINQ que proyecta hijos en una colección Entity Framework ¿De dónde viene y a dónde va? 9 19/04/2013 Evolución de EF hasta EF 5 (beta y final) .NET 3.5 SP1: primer EF .NET 4.0: EF 4.0 EF 4.1: – DbContext, DbC t t Code C d First, Fi t Plantilla Pl till d de EDMs EDM a DbContext DbC t t EF 4.2: – Gestión de versiones EF 4.3: – Migraciones Code First EF 5.0 (actualmente Beta2): – Mapeo a enum, propiedades geográficas, soporte de funciones con valores de tabla tabla, mejoras de rendimiento – VS 11: diagramas múltiples EF 5 (final): – Múltiples diagramas por BD – Importación masiva de procedimientos almacenados a modelo Novedades en EF 6 Mejoras de rendimiento – Generación de vistas más rápida – Funcionamiento asíncrono: async/await de 4 4.5, 5 y SaveChangesAsync() Mejoras de programación – Soporte de enum y datos espaciales en .NET 4 – “Resiliencia” de las conexiones ((importante p p para servicios en la nube) – Resolución de dependencias (Service Locator) 10 19/04/2013 Más novedades en EF 6 Mejoras de configuración – Configuración por código (de EF, no del modelo, además de por archivo.config) – Esquema E por d defecto f t – Añadir configuración (Fluent API) desde ensamblado – Servicios de pluralización de nombres personalizable Mejoras de Code First – Convenciones personalizadas p – Servicios de pluralización de nombres personalizable – Mapeo de procedimientos INSERT/UPDATE/DELETE a entidades Y más novedades en EF 6 Mejoras de migraciones – Configuración de tabla de migraciones – Operaciones de migración personalizadas Mejoras de conexiones y transacciones – Múltiples contextos por base de datos – Contextos sobre conexiones ya abiertas Mejoras de transacciones – Nivel de aislamiento p por defecto = READ_COMMITED_SNAPSHOT – UseTransaction (trabajo con transacciones de DB activas) – BeginTransaction (permite elegir el nivel de aislamiento) 11 19/04/2013 Ahora EF es Open Source EF es Open Source Se puede contribuir al código. Por ej. Unai Zorrilla ha contribuido con: – carga de configuraciones de ensamblado – servicio de pluralización personalizable Extensión de VS: EF PowerTools (¡y no es la única!) Menú contextual proyecto C# – Reverse Engineer g Code First – Customize Reverse Engineer Code First (T4) Menú contextual archivo C# con DbContext – – – – View Entity Data Model (read-only) View Entityy Data Model ((XML)) View Entity Data Model DDL Generate Views (también en menú contextual EDM) 12 19/04/2013 Demo • Hacer un Code First con ingeniería inversa con “EntityFramework Reverse POCO Code First Generator” – Pre-generar vistas – Mostrar el modelo – Mostrar el DDL de SQL del modelo Entity Framework Providers Por supuesto: SQL Server y SQL Server CE • EF 6 (todavía en alpha): DevArt dotConnect: Oracle, MySQL, PostgreSQL, SQLite, SalesForce, SQL Server Se supone que migrarán los de la 5 • EF 5: MySQL Connector, Oracle ODP.NET, PostgreSQL Npgsql, SQLite, Firebird, etc. 13 19/04/2013 www.danysoft.com http://www.danysoft.com/visualstudio 14