2009-08-24 7 views
6

tengo una solución .NET que contiene dos proyectos:Dos proyectos .NET, una cadena de conexión DB?

    proyecto
  • Un ASP.NET MVC, el 'Portal'
  • Una biblioteca de clases,

El proyecto 'modelos' 'modelos' contiene un contexto de datos Linq-to-SQL junto con unas pocas clases parciales que amplían los objetos de la base de datos.

La cadena de conexión se define en el archivo web.config del proyecto 'Página web'.

Sin embargo, el proyecto 'Modelos' parece tener su propia aplicación.config donde la conexión de la base de datos se define por separado.

Esto significa que si la cadena de conexión cambia, tendré que actualizar ambos proyectos.

¿Hay alguna manera de centralizar la cadena de conexión en un solo lugar y aún así tener ambos proyectos usándola?

Respuesta

4

Cree una clase parcial que sea igual a su contexto de datos y use este código para forzar el uso de la cadena web.config en lugar de app.config. Coloque la clase parcial en la misma ubicación que su modelo en la biblioteca de la clase.

public partial class YourDataContext 
{ 
    partial void OnCreated() 
    { 
     ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"]; 

     if (cs != null) 
     { 
      this.Connection.ConnectionString = cs.ConnectionString; 
     } 
    } 
} 

Ver esta pregunta para obtener más información Preferred Method for connection string in class library
RichardOD publicó un enlace a lo que creo que mejor describe nuestro problema LINQ To SQL and the Web.Config ConnectionString Value

+0

¿Cuál es el voto negativo? – Breadtruck

+2

¿Pero cómo funcionará esto, ya que las clases parciales deben pertenecer al mismo ensamblado? Quiero que el ensamblado de 'Modelos' use la cadena de conexión del web.config en el ensamblado 'Página web'. – Jonathan

+0

Por cierto, no hice ningún downvoting. – Jonathan

1

Yo diría que debe mantener la configuración del producto en el web.config del proyecto web, y luego inyectar la configuración que utiliza en el proyecto del modelo.

+0

Esto es lo que hago. Ver mi respuesta para el ejemplo de código real – Breadtruck

2

Eso está bien. Coloque la cadena de conexión del Modelo en Web.config y olvide (elimine) el archivo de configuración del Modelo.

El DataContext también toma en una cadena de conexión en su constructor para que pueda especificar que de esta manera también (tal vez no en una línea sin embargo):

DataContext context = new DataContext(ConfigurationManager.ConnectionStrings["TheKey"].ConnectionString); 

Editar- basado en sus comentarios a otras respuestas se ve como si estuvieras haciendo algo mal. Si está haciendo eso, entonces el código generado usará el valor de configuración predeterminado.

System.Configuration.DefaultSettingValueAttribute("Data Source=SERVER;Initial Catalog=XYZ;Integrated Security=True")]. 

Quizás se cometer el error de not specifying the connection string properly en el archivo Web.config.

+0

@RichardOD: Estoy comentando, pero en realidad no hice la pregunta, aunque sí le pregunté a uno similar hace un tiempo. Nunca intenté simplemente eliminar el archivo appconfig. Mi tía lo había sugerido, pero también tenía algunos modelos de conjuntos de datos en el proyecto y en este caso tienes que crear numerosas clases parciales de compilación de tablas, y no iba a hacer eso, así que no he intentado eliminar la aplicación. config, pero imagino que funcionaría. – Breadtruck

0

Ok, estoy adivinando aquí, pero parece que ambos proyectos usan una cadena de conexión idéntica, ¿sí?

En ese caso, solo especifique la cadena de conexión en web.config; la biblioteca de clases app.config no será leída por ASP.NET de todos modos.

+0

Esa no ha sido mi experiencia a menos que tuviera algo configurado mal. – Breadtruck

+0

¿De verdad? ¿Estás usando un componente de un tercero que lo hace por ti? Porque en mi experiencia, solo el app.config para el ejecutable (o en el caso de ASP.NET web.config) es leído por el sistema por defecto. Si hay una app.config asociada con una biblioteca de clases (.DLL), el contenido de esa app.config debe ser A) cargado manualmente (que es lo que hacen los componentes de terceros que hacen esto para usted) o B) copiado al app.config/web.config de la aplicación principal. – Randolpho

+0

@Randolpho: Consulte http://stackoverflow.com/questions/1148559 para obtener más aclaraciones sobre mí. – Breadtruck

0

Creo que la cadena de conexión en la biblioteca de modelos solo la usa el diseñador. Durante el tiempo de ejecución, la cadena se carga desde web.config. Por lo tanto, no es necesario que las cadenas estén sincronizadas.

+0

Eso no es lo que he encontrado después de implementar una solución como esta en la producción. La biblioteca continuó sacando su conexión de la aplicación .config. – Breadtruck

0

No es necesario el app.config biblioteca de clases. Simplemente ponga su configuración en el web.config. Además, si necesita alguna sección de configuración de la aplicación de la biblioteca.config, solo colóquelo en la web.config. ConfigurationManager lo leerá desde allí.

0

Si su biblioteca de modelos Class está referenciada en su aplicación web, puede simplemente eliminar la referencia en el archivo App.Config y asegurarse de tener algo similar a la que se encuentra en su web. config. De esta forma, cuando el compilador busque en el web.config, encontrará la cadena de conexión que necesita para el proyecto MVC y, por lo tanto, no tendrá que buscarla más adelante.

+0

Intenté esto, pero parece obtener la cadena de conexión de un archivo 'Configuración' bajo las propiedades del proyecto de Modelos. Hay un código como este en la clase: 'global :: Models.Properties.Settings.Default.WebConnectionString, mappingSource)' – Jonathan

+0

@jonathanconroy: que es exactamente por lo que mi respuesta te ayudará a solucionar este problema. – Breadtruck

0

Personalmente, se extienden DataContext en mi Repositorio luego hacer algo como:

public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

De esa manera mi repositorio se pueden crear instancias y nunca se preocupe por el establecimiento de una conexión, o tener que tratar con él en absoluto. Para cambiar a/desde las bases de datos dev/live solo cambio mi web.config.

0

La app.config en la biblioteca no tendrá efecto en la producción; esas cadenas de conexión están realmente ahí para el diseñador linq2sql. Nada que ver, avanzar, estos no son los droides que estamos buscando. . .

Cuestiones relacionadas