c# linq-to-sql connection-string datacontext

c# - ¿Puedo evitar que el diseñador de dbml agregue una cadena de conexión al archivo dbml?



linq-to-sql connection-string (3)

Tenemos una función personalizada AppSettings.GetConnectionString() que siempre se llama para determinar la cadena de conexión que debe utilizarse. Cómo funciona esta función no es importante para la discusión. Basta con decir que devuelve una cadena de conexión y tengo que usarla.

Quiero que mi LINQ to SQL DataContext use esto, así que eliminé toda la información de la cadena de conexión del archivo dbml y creé una clase parcial con un constructor predeterminado como este:

public partial class SampleDataContext { public SampleDataContext() : base(AppSettings.GetConnectionString()) { } }

Esto funciona bien hasta que uso el diseñador para arrastrar y soltar una tabla en el diagrama. El acto de arrastrar una tabla al diagrama hará varias cosas no deseadas:

  • Se creará un archivo de configuración.
  • Se creará un archivo app.config
  • Mi archivo dbml tendrá incrustada la cadena de conexión

¡Todo esto se hace antes de que incluso guarde el archivo!

Cuando guardo el diagrama, se recrea el archivo del diseñador y contendrá su propio constructor predeterminado que utiliza la cadena de conexión incorrecta. Por supuesto, esto significa que mi DataContext ahora tiene dos constructores predeterminados y no puedo construir más.

Puedo deshacer todas estas cosas malas pero es molesto. ¡Tengo que eliminar manualmente la cadena de conexión y los nuevos archivos después de cada cambio!

¿Hay alguna forma de evitar que el diseñador realice estos cambios sin preguntar?

EDITAR

El requisito para usar el método AppSettings.GetConnectionString() me fue impuesto bastante tarde en el juego. Solía ​​usar algo muy similar a lo que genera para mí. Hay bastantes lugares que llaman al constructor predeterminado. Soy consciente de que los cambiaré todos para crear el contexto de datos de otra manera (utilizando un constructor diferente, método estático, fábrica, etc.). Ese tipo de cambio solo sería un poco molesto, ya que solo tendría que hacerse una vez. Sin embargo, siento que es eludir el problema real. El archivo dbml y los archivos de configuración seguirán conteniendo una cadena de conexión incorrecta, si no se utiliza, que en el mejor de los casos podría confundir a otros desarrolladores.


Esto es un poco ''hacky'', pero podría agregar un parámetro a su constructor (¿uno que no se usa?), Usar este constructor en todas partes y el predeterminado creado por el diseñador no le causará ningún problema.


Mientras esté en el diseñador para el DBML, puede hacer clic con el botón derecho en cualquier espacio en blanco y hacer clic en Propiedades (no es lo mismo que hacer clic con el botón derecho en el archivo DBML y hacer clic en Propiedades). A partir de ahí, expandir la opción "Conexión". Establezca "Configuración de la aplicación" en Falso y borre la configuración de "Cadena de conexión". Estas configuraciones son las que utiliza el diseñador para crear ese constructor predeterminado.

Desde allí, puede usar el constructor predeterminado que ha creado fuera del archivo designer.cs. Desafortunadamente, tendrá que repetir este proceso cada vez que agregue nuevas tablas al diseñador. Es molesto, y siento tu dolor.


Podría usar algo como SqlMetal para generar su propio archivo de DataContext designer, pero tiene razón: el DataContext por defecto es bastante difícil de abrir.

Su otra opción es obtener su DataContext de un método de fábrica, para que pueda ocultar qué constructor se utiliza realmente. Aún mejor si lo haces a través de un marco de IoC como Castle Windsor. Entonces podrías hacer cosas como:

var context = container.Resolve<DataContext>();