Omar del Valle Rodríguez

Compartir puede significar enseñar o aprender...
EF 4.1 Code First ¿Dónde está la base de datos?

Hola

Me voy a saltar el post pendiente que tengo sobre crear o comentar algún código existente sobre el algoritmo Hi/Lo para los Object ID en Entity Framework. El culpable de este salto es un inquieto colega de proyecto que se puso a probar un artículo que publicamos hace unos días por Twitter sobre MVC 3 con Repositorios e inyección de dependencias usando Entoty Framework.

El artículo no permite descargar el código del ejemplo, así que, gracias Oscar por ahorrarme el trabajo   

Después del prólogo y los agradecimientos, entramos en materia.

El problema, si le podemos llamar así, ya lo tenía anotado como uno de los temas a tratar en esta nueva aventura con Entity Framework. El código causante de todo el debate es este:

La parte que nos importa en la clase Db, la cual hereda del contexto, es la implementación del constructor que llama a la base pasando como parámetro la cadena “DemoDb2”. El parámetro que se le pasa al contexto, según el MSDN, identifica la cadena de conexión o el nombre de la base de datos asociada al modelo que vamos a usar. Este simple código, si no conoces qué hace Entity Framework con él, nos puede costar un “poquito de dolor de cabeza”.

Supongamos que vamos a nuestro archivo de configuración y definimos la siguiente cadena de conexión (Observe que he puesto “DemoDb” y no “DemoDb2)

 

…o simplemente olvidamos que debemos configurar el web.config  para indicar la cadena de conexión. Ejecutamos y “walaaa”    Nuestra aplicación funciona

Si voy a mi servidor en busca de la base de datos me encuentro con que no existe. Pues bien, si EF no encuentra la cadena de conexión o la misma es incorrecta, utiliza el SQL Express que tengamos instalado en local y con autenticación integrada de Windows, crea la base de datos.

Les juro que no estoy haciendo trampas, ninguna de las bases de datos que están tachadas es la del ejemplo 

En mi opinión, hubiera preferido que ocurriera un error y así darme cuenta que tenía algo mal, digamos que algo así...

 Editado: En los comentarios, Pablo Núñez  nos dice cómo lograr que EF pueda tener el mismo comportamiento que NH. (Gracias Pablo)

 

Published 14/7/2011 22:02 por Omar del Valle Rodríguez

Comparte este post:

Comentarios

# re: EF 4.1 Code First ¿Dónde está la base de datos?@ Friday, July 15, 2011 12:49 AM

Coincido en que el comportamiento por defecto debería ser menos agresivo. Aunque hay alternativas: se puede forzar el mismo comportamiento de NHibernate modificando Database.SetInitializer a un inicializador personalizado.

Y para el típico caso en que el EF confunde el nombre de la ConnectionString con el nombre de la base de datos, hay una solución más sencilla:

public Db() : base("name=DbDemo2") { }

Así dará una excepción si no encuentra el parámetro DbDemo2 en web.config. Más info en: social.msdn.microsoft.com/.../5756081a-8c75-4200-ae47-efdd7862efec

Pablo Núñez

# re: EF 4.1 Code First ¿Dónde está la base de datos?@ Friday, July 15, 2011 1:03 AM

A punto estuve de animarme a escribir yo algo sobre el tema pero me alegro de no haberlo hecho.

Mucho más claro así y metiendo caña con NHibernate que yo no hubiera podido  :-)

Lo mismo se podría poner el código para descarga para los interesados en probarlo...¿que opinas?

Óscar.SS

# re: EF 4.1 Code First ¿Dónde está la base de datos?@ Friday, July 15, 2011 8:28 AM

@Pablo... Muchas gracias por el comentario..

Es verdad que quería enfocar el artículo más a ese comportamiento por defecto, pero ya que estábamos y para ser justos, debí incluir cómo lograr q EF pudiera tener el mismo comportamiento que NH.

Edito el artículo para indicar que en los comentarios podrán encontrar la solución.. ;)

Gracias de nuevo...

@Oscar, no publiqué el código porque aunque nos ha valido de ejemplo para ver este comportamiento de EF, no tiene mucho que ver con lo que queríamos destacar.

Gracias a los dos por los comentarios.

Salu2

Omar del Valle Rodríguez

# re: EF 4.1 Code First ¿Dónde está la base de datos?@ Friday, July 15, 2011 9:03 AM

da mucho miedito, te crea una base de datos sin que te des cuenta...

preguntoncojonero

# re: EF 4.1 Code First ¿Dónde está la base de datos?@ Friday, July 15, 2011 6:41 PM

sí "pregunton..."  :) aunque después de conocer el comportamiento, ya no tanto.

Omar del Valle Rodríguez

# re: EF 4.1 Code First ¿Dónde está la base de datos?@ Sunday, July 17, 2011 12:37 PM

Esto es un tema que se ha comentado y mucho, pero en realidad "no es un problema", es una diferencia de convención, mucha gente cree que esto no debería ser automático, otra mucha gente cree que por defecto es una buena estrategia, etc... La suerte es que como muy bien comento Pablo Nuñez en este caso puedes cambiar la convención estableciendo un nuevo IDatabaseInitializer..

Nota: De todas formas, porque en el post no queda claro, el nombre que EF busca por defecto en las cadenas de conexiones es el nombre completamente cualifcado de tu unidad de trabajo, incluyendo namespace...

Unai

Unai

# re: EF 4.1 Code First ¿Dónde está la base de datos?@ Sunday, July 17, 2011 5:15 PM

Gracias por el comentario @Unai.. ;)

Al principio del post comentaba que este comportamiento no era precisamente un problema y estoy de acuerdo en ello...  

Quizás para quienes trabajen en local contra su SQL Express como gestor de BD, seguro que esto es genial, pero si se trabaja contra un servidor y en equipo el problema puede ser mayor o, al menos nos tomará unos minutos hasta que nos demos cuenta.

Lo importante creo que es conocerlo, ya evitarlo o no, seguro dependerá de las necesidades de cada proyecto.

Gracias por la aclaración sobre la cadena de conexión.. no lo sabía..

Salu2  

Omar del Valle Rodríguez

# re: EF 4.1 Code First ¿Dónde está la base de datos?@ Monday, July 18, 2011 4:33 PM

Omar, si lo que quieres es trabajar contra otro servidor o en otro equipo por defecto también puedes utilizar la clase Database tal y como sigue:

Database.DefaultConnectionFactory = new SqlConnectionFactory("Server=.;Integrated Security=false");

Con esto le estarás diciendo a EF cual es la instancia por defecto a utilizar...en este caso (local) no SQLEXPRESS como es por defecto.

Unai

Unai

# re: EF 4.1 Code First ¿Dónde está la base de datos?@ Monday, July 18, 2011 6:40 PM

Gracias Unai!!!.. voy a probarlo :)

Omar del Valle Rodríguez