EF 4 + CTP 5 = Code First : Database III

Este es el tercero y último post dedicado a la creación y uso de las bases de datos en EF 4 + CTP 5, puede revisar las dos entradas anteriores, I y II, si desea recordar lo tratado en las mismas. En esta ocasión, trataremos de mostrar los inicializadores.

 

La clase DbDatabase, comentada ya en el anterior blog, además de elementos para establecer la factoria a utilizar y distintos métodos de ayuda nos permite establecer distintas estrategias de inicialización de nuestras bases de datos, de tal forma, que antes de crearlas o utilizarlas podamos escribir algunos pasos. Estas estrategias de inicialización pueden asignarse mediante el uso del método SetInitializer, el cual, como vemos a continuación, nos permite establecer una estrategia, definida por un contrato llamado IDatabaseInitializer<TContext>.

Este contrato de inicialización, como puede verse a continuación en un ejemplo de implementación custom, únicamente define un método, InitializeDatabase, en el cual podremos colocar el código de inicialización que necesitemos.

Estas estrategias de inicialización, como seguramente ya sabrá, son utilizadas por ellos para la generación del esquema de la base de datos o la actualización de la misma. Dentro del espacio de nombres System.Data.Entity.Database podemos encontrar las tres estrategias siguientes:

  1. CreateDatabaseIfNotExist<TContext>
  2. DropCreateDatabaseAlways<TContext>
  3. DropCreateDatabaseIfModelChanges<TContext>

Los nombres de las estrategias creo que son bastante descriptivos, por lo tanto no necesitan explicación. A continuación, en las siguientes lineas de código podemos ver como realizar la inicialización de una estrategia, por defecto no hay ninguna asignada, aunque en la documentación se sugiera que está DropCreateDatabaseIfModelChanges.

 

Buceando en el código con Reflector, una de las primeras cosas que suelo hacer siempre cuando reviso una CTP o versión preliminar, de los que la documentación es escasa, se puede ver como siempre que se asigna un elemento DbDatabase, del que ya hemos hablado, se busca en la configuración de la aplicación los inicializadores que queremos.

El código en concreto es el siguiente:

De este código uno puede extraer el formato de la especificación en configuración, personalmente lo veo demasiado ofuscado, tanto el formato como la forma de disponerlo en configuración, no obstante, me imagino que será una de las cosas que cambien. Con el fin de mostrar un ejemplo de un inicializador en configuración, las siguientes lineas muestran como asignar un inicializador de nombre CustomStrategy a un contexto de nombre CustomerContext.

Con esta tercera entrega hemos dado una vuelta a todo lo que se refiere creación/uso de bases de datos con respecto a EF 4 + CTP 5. En los siguientes post a vanzaremos en temas como el mapeo de las entidades y las convenciones.

 

Saludos

Unai

EF 4 + CTP 5 = Code First : Database II

 

En el post anterior de la serie empezamos a tratar el tema del manejo de las base de datos con EF 4 + CTP 5 y Code First. En el, vimos como se gestionan los nombres de las bases de datos a utilizar/crear y que mecanismos tenemos para modificarlos. En esta ocasión, hablaremos de los mecanismos de cambio del provedor e instancia por defecto a utilizar.

Si partimos del mismo ejemplo que la entrada anterior, a continuación, tal y como comentamos el sistema por defecto intentará utilizar/crear una base de datos en la instancia por defecto .SQLEXPRESS

Cambiar esta convención, al igual que para el caso anterior con el nombre, también es muy sencillo. De hecho, podríamos utilizar la técnica del archivo de configuración igual que hicimos anteriormente con el nombre. Por ejemplo, si quisieramos apuntar a nuestra instancia (local) simplemente tendríamos que agregar la siguiente entrada en el archivo de configuración.

Otra alternativa, es utilizar la extensibilidad que nos da EF 4 + CTP5, sobre la cual hablaremos a continuación. La clase DbDatabase, definida dentro del espacio de nombres System.Data.Entity.Database, nuevo espacio de nombres incluído con la CTP 5, pone a nuestra disposición una propiedad estática que nos permite especificar la factoria de creación de las conexiones, DbConnection, a utilizar por la infraestructura, en esta propiedad, como se puede ver a continuación, podremos recuperar o asignar el IDbConnectionFactory concreto que deseamos utilizar.

Por defecto, en esta CTP, solamente tenemos dos IDbConnectionFactory a utilizar, SqlConnectionFactory y SqlCeConnectionFactory. Como se imaginará, el primero está indicado para trabajar con Sql Server y el segundo contra Sql Server Compact Edition. Por supuesto, nadie nos prohibe crear nuestra propia factoria y por lo tanto, especificar en ella cuales son las convenciones que deseamos utilizar por defecto.

Crear una nueva factoria es relamente sencilla, nuestro contrato solamente nos obliga a implementar un sencillo método, como vemos en el siguiente fragmento.

El método CreateConnection nos proporciona el nombre o cadena de conexión asignado a la base de datos, que como usted sabe ya ha podido indicarse desde la cadena de conexión o bien haciendo uso de unos de los constructores de DbContext, esto lo hemos visto en el post anterior.

 

Si revisaramos el código de SqlConnectionFactory podríamos observar como en su constructor por defecto se establece una cadena de conexión base, sin especificar el catálogo, y que la misma, es, como ya sabemos, apuntando a la instancia de SqlExpress. Nosotros, podríamos hacer lo mismo con la nuestra contra una instancia por defecto distinta o bien con alguna configuración particular.

Bueno, hasta aquí llegamos con la segunda entrada. La siguiente, también la dedicaremos a este mismo tema, la creación y uso de las bases de datos en EF 4 + CTP 5 + Code First. En este caso, el tema tratará de inicializadores, migración de modelos etc.

 

Saludos

Unai

EF 4 + CTP 5 = Code First : Database I

Los que me conozcan de este blog sabrán que no suelo hacer ningún 101, y menos aún a estas alturas de Entity Framework. Por supuesto, el no hacer ningun 101 de introducción no es por presunción sino porque generalmente siempre llego tarde a este tipo de cosas y ya hay en internet muchos ejemplos que revisar. El  caso de Code First y la CTP 5 de ADO.NET EF no es una excepción, para 101 y temas introducctorios el equipo de producto de Entity Framework tiene en su blog excelentes elementos introductorios sobre esta CTP que le recomiendo revisar. A lo largo de este post, y seguramente una lista que le seguirán, trataremos de ver diferentes elementos importantes dentro de las novedades de la CTP 5 y el uso de Code First.

Esta primera entrada la dedicaremos a los distintos aspectos relacionados con la base de datos y nuestro código de Entity Framework + Code First. Desde el nombre, la creación hasta elementos de extensibilidad que podremos utilizar.

Para empezar a hablar acerca de las convenciones de nombres, instancias dónde se crean y otros elementos relacionados con las base partiremos de un ejemplo trivial, nuestro objetivo ahora nos es fijarnos en mapeos de entidades ni elementos de los contextos, solamente en lo relacionado con la base de datos.

 

 

Si usaramos este ejemplo trivial de unidad de trabajo podríamos observar como automáticamente una nueva base de datos, llamada CustomerContext, se crea en la instancia con nombre SQLEXPRESS, lógicamente si esa instancia no existiera el código daría una excepción.  De aquí, ya sacamos varias conclusiones, acerca del tratamiento que esta CTP 5 hace con respecto a la creación de las bases de datos asociadas a nuestros contextos de trabajo.

 

  • Por convención, el nombre de la base de datos se extrae del nombre del contexto de trabajo asociado, de forma completamente cualificada.
  • El proveedor por defecto es Sql Server
  • La instancia por defecto es .SQLEXPRESS

Como se imaginará, todos estos elementos son configurables. A lo largo de las siguietes lineas iremos viendo como cambiar/modificar cada una de las convenciones anteriores. Empezaremos por lo más sencillo, modificar el nombre de nuestra base de datos, para ello, dipondremos de distintas alternativas. La primera, y también la más sencilla, es hacer uso de uno de los constructores que DbContext, clase base para los contextos de trabajo en Code First, gracias al cual podremos especificar el nombre de la base de datos que querramos construir o usar, opcionalmente también podríamos establecer la cadena de conexion.

En el siguiente ejemplo, vemos como hacer uso de este constructor para indicar que el nombre de nuestra base de datos querramos que sea SampleDB.

 

Otra via, para modificar el nombre de la base de datos a generar o usar, es por medio de nuestro archivo de configuración y la hiper conocida sección de cadenas de conexión, connectionstring. EF 4 + CTP 5 utiliza una convención por la cual puede extraer, la cadena de conexion y por lo tanto el nombre de la base de datos a usar, buscando en la sección de cadenas de conexión una con el nombre del contexto, perfectamente cualificado. Asi, si nuestro contexto fuera DatabaseNamingSample.CustomerContext, poniendo la siguiente entrada en nuestro archivo de configuracion podríamos establecer la cadena de conexión a utilizar o crear.

 

Continuará…..

 

Un saludo

Unai zorrilla Castro

Nuevo Libro: ADO.NET Entity Framework 4.0

 

Hoy mismo, se acaba de poner a la venta mi nuevo libro sobre ADO.NET Entity Framework 4.0. La verdad, es que quizás este haya sido el libro más costoso de escribir, puesto que entre las novedades de la versión y las ideas que tenía sobre el no me acababa de poner.untitled  Al igual que en la edición anterior, en esta tengo también el placer y el gusto de compartir esta obra con algunos colaboradores y amigos como son Yamil Hernandez Saa, Cesar de la Torre Llorente y Pablo Pelaez Aller.

Para los que estéis interesados en esta obra comentaros que han cambiado algunas cosas interesantes con respecto a la version anterior.  En primer lugar se ha realizado una completa revision de aquellos elementos que tienen sentido en esta nueva version como el modelado de entidades, reordenándolos y haciendo un repaso más profundo a patrones habituales en modelos de dominio como Aggregate Roots, así como una explicación sobre los Bounded Context y como dividir los modelos de entidades. Lógicamente, para nuestros servicios de objetos, también se han introducido novedades en cuanto al uso de patrones típicos y las características de la nueva version  como los artefactos de generacion, las plantillas T4, para las cuales disponemos también de un apéndice informativo.

 

En definitiva, este libro no es solamente una actualización, es una revision completa que ha requerido de la reescritura de muchos elementos, amén de los nuevos. Otro  punto importante de mejorar está en los materiales asociados al libro, ahora, junto con la ficha del libro se disponen de todos los materiales, plantillas T4, codigo SQL, proyectos de Visual Studio 2010 que se utilizan.

Para terminar, se dedica un capítulo al uso de ADO.NET Entity Framework 4.0 en el mundo real, para lo cual nos apoyamos en la aplicación de ejemplo Microsoft NLayer APP y gracias a la cual podremos ver muchos patrones típicos de uso en ejemplos claros y concretos.

 

Sin más, me despido con los datos de la ficha del libro desde dónde podréis comprarlo, en formato impreso, pdf  o ámbos. Además desde esta misma ficha, podréis leer tanto el índice como el capítulo de introducción de forma gratuíta por medio de scribid, ahora mismo scribid estaba roto pero esperemos que pronto este up!

P.D: Algunas personas me comentaron si Code First forma parte de este libro. En esta ocasion, debido a que esta en CTP y sufrirá bastantes cambios hasta el SP1 de VS 2010, hemos considerado que era mejor no incluirlo. No obstante, en cuanto se publique la version release del feature pack se pondrá en SCRIBID un capítulo dedicado a Code First. Aún no sabemos su gratis para todo el mundo o solamente para los que hayan comprado alguna edición.

Saludos

Unai

Entity Framework y Sql Azure: El issue y la solución

Como muchos sabréis ya, seguramente aquellos que tengais proyectos en la nube de Azure, la topología de Sql Azure puede darnos unos cuantos quebraderos de cabeza, puesto que, en determinadas condiciones podríamos tener pérdidas de conexiones.untitled  En la wiki de Technet hay un articulo muy bueno explicando tanto la topología de SQL de Azure así como los distintos problemas y sus motivos. Navegando por la web hay cantidad de articulos referidos a como manejar los problemas de conexión en ADO.NET tradicional, sin embargo, no hay esta información sobre como manejar estos problemas con Entity Framework, de hecho, hasta he leído que esto invalidaba el uso de EF en AZURE. Pues bien, a lo largo de este post veremos como manejarnos con AZURE y  EF de una forma realmente sencilla. Para ello haremos un par de casos, el primero utilizando EF sin artefacto de generación y posteriormente con un artefacto cualquiera, STE por ejemplo.

Para el primer caso, sabemos que el contexto de trabajo de ADO.NET Entity Framework nos ofrece un método parcial OnContextCreated dónde nosotros podemos escribir código una vez que un contexto de trabajo de EF se crea. La llamada a este método parcial está en cada uno de los constructores de la clase. En este método parcial podríamos escribir el siguiente código:

 

Como se puede apreciar, este código unicamente recupera la conexión interna  del contexto de trabajo y ejecuta un comando ‘tonto’ contra la base de datos. Sin nos encontraramos ante el caso de una conexión perdida, este comando fallaría entrando en nuestro manejador de excepción. En este manejardor, cerramos y abrimos la conexion, esto en ADO.NET nos garantiza que el pool de conexiones se invalida, el siguiente artículo hablar claramente sobre las invalidaciones del pool en ADO.NET.

 

En el caso de que estemos trabajando con algún artefacto de generación de código como STE, podremos ver como el método parcial OnContextCreated ya no está disponible. Lógicamente, al tener nuestras plantillas T4, el uso de métodos parciales ya no tiene demasiado sentido puesto que el código a generar lo podemos escribir directamente en la plantilla.  No obstante, para no complicar demasiado el ejemplo del post, podemos agregar dentro de los constructores de nuestro contexto en la plantilla, una llamada a OnContextCreated, como se ve a continuación, y establecer este método directamente dentro de nuestra plantilla.

 

En el proyecto NLayerApp de Microsoft en su version 1.0, que espero ya conozca, puede ver un ejemplo completo de una solución de Azure con este workaround para Sql Azure.

 

Saludos

Unai

EF 4 FEATURE CTP 5

Porfin la esperada CTP del anteriormente llamado “feature pack” se ha liberado de forma publica, desde el blog de ADO.NET se han publicado una serie de post, tanto para la descarga de esta CTP como algunos samples tanto de las nuevas fluent apis de Code First como de algunos elementos nuevos como la integración de edmx con code first. Os recomiendo la lectura de estos post, puesto que no tienen desperdicio. Por mi parte, poco a poco iré poniendo algunas cosillas interesantes, sobre todo de configuración de las API como algunos elementos menos conocidos. Más adelante, para completar el libro de EF 4.0 intentaré sacar un papper gratuito cubriendo esta temática.

 

A continuación, los posts:

 

http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-released.aspx

http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-code-first-walkthrough.aspx

http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-model-amp-database-first-with-dbcontext.aspx

http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent-api-samples.aspx

 

Saludos

Unai