2011-02-08 22 views
16

Estoy utilizando Entity Framework y recientemente me di cuenta de los beneficios de tener su modelo EF en otro proyecto dentro de la misma solución para que pueda construir múltiples IU desde él.Mover el modelo de Entity Framework a la biblioteca de clases desde el proyecto web

Lo pasé a un nuevo proyecto de biblioteca de clases y actualicé todas las referencias a las entidades en el proyecto web para usar el nuevo dll generado por el proyecto. Todo ha ido bien, a excepción de un pequeño inconveniente. Cuando moví EF al nuevo proyecto, de alguna manera todavía estaba leyendo su cadena de conexión del web.config en el proyecto web (no me pregunten cómo porque no tengo idea).

Utilicé "Actualizar el modelo de la base de datos" en el diseñador EF y no encontré una cadena de conexión (como esperaba después de moverlo al nuevo proyecto) así que usé el asistente para generar una nueva cadena de conexión, que lo hizo bien. La nueva cadena de conexión ahora reside en App.config dentro del proyecto de biblioteca de clase. La cadena de conexión en la ventana de propiedades es correcta ahora, y el diseñador la está leyendo desde App.Config. Seguí adelante y eliminé la cadena de conexión de Web.Config en el proyecto web.

Ahora al ejecutar la aplicación me sale el siguiente error:

The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.

Si me pega la cadena de conexión de nuevo en el web.config que todo funciona bien. No quiero crear un nuevo modelo de EF desde cero porque es un modelo bastante complicado y realicé muchas reestructuraciones después de llegar desde la base de datos. He pasado el archivo CS generado y el XML en el archivo edmx y no encuentro nada útil. Cualquier ayuda es muy apreciada. Obviamente por ahora, hasta que me dé cuenta de esto, solo estoy dejando la cadena de conexión en web.config ya que, por la razón que sea, eso parece funcionar.

Respuesta

20

Esto es por diseño; mientras que el archivo de configuración en la biblioteca de clase es lo que usará el diseñador, el archivo de configuración de la aplicación real es lo que se usará en el tiempo de ejecución. Si eso es Web.config para un proyecto ASP.NET o App.config para un proyecto Winforms o WPF, es el archivo de configuración de la aplicación (o algo más arriba, como Machine.config) que se utilizará; el archivo en la biblioteca de la clase no es parte de la aplicación.

Si está tratando de proporcionar un modelo EF que funcione sin tener que especificar la cadena de conexión en la aplicación o el archivo de configuración web, deberá almacenar la cadena de conexión de otra forma (siempre puede ser difícil) -código) y pasarlo a la sobrecarga apropiada del constructor de su contexto.

Mi solución generalmente es proporcionar una función estática sin parámetros en el contexto mismo que llama a esta sobrecarga con la cadena de conexión adecuada.

+3

¿Espera, entonces eso significa que el archivo app.config en la biblioteca de la clase no tiene sentido? ¿No debería la biblioteca compilada tener acceso a sus propios recursos? ¿Cómo es siquiera consciente del web.config en el otro proyecto? – Chev

+2

@Chevex: En tiempo de ejecución, sí, no tiene sentido. El archivo de configuración no es un recurso, es solo un archivo de configuración que es parte del proyecto. Construir el proyecto no le hace nada. Tiene conocimiento de Web.config porque usa el administrador de configuración de .NET, y la aplicación que inicia (en su caso, una aplicación web) lo dirige allí. –

Cuestiones relacionadas