2009-07-10 9 views
6

Nous avons deux bases de données, DEV et STAGING. Ils sont pour la plupart identiques. J'ai une étiquette de paramètres d'application dans le Web.Config appelez-le "mode", et deux entrées de chaîne de connexion. Si mode = DEV Je veux utiliser ConnectionString 1 sinon utiliser ConnectionString 2. Cela fonctionne très bien dans certaines parties de l'application, mais le dbml ne semble pas changer les chaînes de connexion. J'utilise cette fonction dans une classe UtilitairesLinqToSql dbml bascule dynamiquement la chaîne de connexion

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 

Cela fonctionne pour la myriade de procs stockées dans cette application héritée, mais le dbml, semble toujours utiliser la chaîne de connexion de stockage intermédiaire.

Quand je regarde les propriétés du dbml, je vois qu'il est codé en dur à la ConnectionString Mise en scène, mais je pensais que j'overridding en changeant la designer.vb pour le dbml comme celui-ci

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 

Y a-t-il quelque chose que je puisse faire pour forcer le dbml à utiliser la bonne connectiontring basée sur l'entrée Web.config?

Répondre

9

J'utiliserais une méthode usine dans une classe partielle pour le DataContext. Gardez à l'esprit qu'une chaîne de connexion pour un DataContext est différente d'une chaîne de connexion ADO.NET classique.

code .... Je ne l'ai jamais utilisé VB.NET, mais il devrait être quelque chose comme ceci:

Partial Public Class MyDataContext 

    ' GetConnectionString code here 
    ' 

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

Utilisez qu'au lieu d'utiliser New MyDataContext().

Sinon, vous pouvez appeler

dc = New MyDataContext(GetConnectionString()) 

partout où vous obtenez une nouvelle instance, mais je préfère la méthode d'usine.

L'idée de base est la même que votre sous-classe, mais sans avoir besoin d'un nom de classe supplémentaire confus. Les classes partielles sont très utiles quand il s'agit d'Entity Framework (ou de tout outil de génération de code). Vous pouvez ajouter des méthodes de logique métier à vos classes générées par Entity Framework, etc.

+0

Je n'utilise pas VB par choix. Je suis un gars C#. Cette application particulière a été codée dans VB.NET et .NET 1.1. Nous avons proposé de le réécrire en C# et en raison des contraintes de temps qui ont été abattu. :(Merci pour votre réponse – Hcabnettek

+0

C'est comme ça que je le fais – mattruma

+0

Cela fonctionne superbe !!! Je suis allé les méthodes d'usine et mis à jour le tout à Dim db comme myDataContext = myDataContext.Create Je suppose partagé est similaire à C# Static Comme la méthode apparaît dans Intellisense, merci pour la solution géniale !! – Hcabnettek