2009-07-10 16 views
6

Tenemos dos bases de datos, DEV y STAGING. Son en su mayor parte idénticos. Tengo una etiqueta de configuración de la aplicación en Web.Config llámala "modo" y dos entradas de la conexión.LinqToSql dbml conmuta dinámicamente connectionstring

Si modo = DEV Quiero usar ConnectionString 1; de lo contrario, uso ConnectionString 2. Esto funciona bien en algunas partes de la aplicación, pero el dbml no parece estar cambiando las cadenas de conexión. estoy usando esta función dentro de una clase Utilidades

Public Function GetConnectionString() As String 
    Dim connectionStringToGet = String.Empty 
    Select Case GetCurrentApplicationMode() 
     Case "DEV" 
      connectionStringToGet = "Dev" 
     Case "STAG" 
      connectionStringToGet = "Staging" 
     Case "PROD" 
      connectionStringToGet = "Production" 
    End Select 
    Return ConfigurationManager.ConnectionStrings(connectionStringToGet).ConnectionString 
End Function 

Esto funciona para la gran cantidad de procedimientos almacenados en esta aplicación legado, pero el dbml, parece que utilizar siempre la cadena de conexión de puesta en escena.

Cuando ver las propiedades de la dbml, veo que es difícil codificado a la connectionstring Staging, pero pensé que estaba overridding esto cambiando la designer.vb para la dbml como este

Public Sub New() 
    MyBase.New(Utilities.GetConnectionString(), mappingSource) 
    OnCreated 
End Sub 

Public Sub New(ByVal connection As String) 
    MyBase.New(connection, mappingSource) 
    OnCreated 
End Sub 

Public Sub New(ByVal connection As System.Data.IDbConnection) 
    MyBase.New(connection, mappingSource) 
    OnCreated 
End Sub 

Public Sub New(ByVal connection As String, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource) 
    MyBase.New(connection, mappingSource) 
    OnCreated 
End Sub 

Public Sub New(ByVal connection As System.Data.IDbConnection, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource) 
    MyBase.New(connection, mappingSource) 
    OnCreated 
End Sub 

¿Hay algo que pueda hacer para obligar al dbml a utilizar la conexión correcta basada en la entrada Web.config?

Respuesta

9

Usaría un método de fábrica en una clase parcial para DataContext. Tenga en cuenta que una cadena de conexión para un DataContext es diferente de una cadena de conexión ADO.NET normal.

Código .... nunca he utilizado VB.NET, pero debe ser algo como esto:

Partial Public Class MyDataContext 

    ' GetConnectionString code here 
    ' 

    Public Shared Function Create() As MyDataContext 
     Return New MyDataContext(GetConnectionString()) 
    End Function 
End Class 

uso que en lugar de utilizar Nueva MyDataContext().

Alternativamente, se podría llamar

dc = New MyDataContext(GetConnectionString()) 

todas partes se obtiene una nueva instancia, pero yo prefiero el método de fábrica.

La idea básica es la misma que su subclase, pero sin la necesidad de un nombre de clase extra confuso. Las clases parciales son muy útiles cuando se trata de Entity Framework (o cualquier herramienta de generación de código). Puede agregar métodos de lógica de negocios a las clases generadas por Entity Framework, etc.

+0

No utilizo VB por elección. Soy un chico C#. Esta aplicación en particular fue codificada en VB.NET y .NET 1.1. Propusimos reescribirlo en C# y debido a restricciones de tiempo que fueron derribadas. :(Gracias por su respuesta – Hcabnettek

+0

Así es como lo hago. – mattruma

+0

Esto funciona excelente! Fui a los métodos de fábrica y actualicé todo a Dim db como myDataContext = myDataContext.Create Supongo que compartir es similar a C# estático como el método se muestra en Intellisense. Gracias por la gran solución! – Hcabnettek

Cuestiones relacionadas