2009-07-10 1 views
6

Abbiamo due database, DEV e STAGING. Sono per lo più identici. Ho un tag di impostazioni app nel Web.Config chiamarlo "mode" e due voci connectiontring.LinqToSql dbml cambia dinamicamente stringhe di connessione

Se mode = DEV, voglio utilizzare ConnectionString 1 altrimenti uso ConnectionString 2. Funziona bene in alcune parti dell'app, ma il dbml non sembra passare le stringhe di connessione. Sto usando questa funzione all'interno di una classe di utilità

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 

Questo funziona per la miriade di stored procedure in questa eredità app, ma la dbml, sembra utilizzare sempre la stringa di connessione Staging.

Quando osservo le proprietà del dbml, vedo che è difficile codificato per la connectionstring Staging, ma ho pensato che stavo overridding questo cambiando il designer.vb per l'dbml come questo

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 

C'è qualcosa che posso fare per forzare il dbml a usare la connessione corretta sulla base della voce Web.config?

risposta

9

Vorrei utilizzare un metodo factory in una classe parziale per DataContext. Tenere presente che una stringa di connessione per un DataContext è diversa da una normale stringa di connessione ADO.NET.

Codice .... non ho mai usato VB.NET, ma dovrebbe essere qualcosa di simile:

Partial Public Class MyDataContext 

    ' GetConnectionString code here 
    ' 

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

L'uso che invece di utilizzare Nuovo MyDataContext().

In alternativa, si potrebbe chiamare

dc = New MyDataContext(GetConnectionString()) 

ovunque si ottiene una nuova istanza, ma io preferisco il metodo factory.

L'idea di base è la stessa della sottoclasse, ma senza la necessità di un nome di classe extra confuso. Le classi parziali sono molto utili quando si tratta di Entity Framework (o di qualsiasi strumento di generazione di codice). È possibile aggiungere metodi di business logic alle classi generate da Entity Framework, ecc.

+0

Non uso VB per scelta. Sono un ragazzo di C#. Questa particolare app è stata codificata in VB.NET e .NET 1.1. Abbiamo proposto di riscriverlo in C# e a causa di vincoli temporali che sono stati abbattuti. :(Grazie per la risposta – Hcabnettek

+0

Questo è il modo in cui lo faccio. – mattruma

+0

Questo funziona magnifico !!! Ho fatto i metodi di fabbrica e aggiornato il tutto a Dim db come myDataContext = myDataContext.Create Immagino sia condiviso è simile a C# Statico come il metodo si presenta in Intellisense.Grazie per l'ottima soluzione !! – Hcabnettek