2009-07-10 90 views
6

我們有兩個數據庫DEV和STAGING。它們大部分是相同的。我在Web.Config中有一個應用程序設置標籤,稱之爲「模式」,以及兩個連接字符串條目。LinqToSql dbml動態切換connectionstring

如果mode = DEV我想使用ConnectionString 1,否則使用ConnectionString 2.這在應用程序的某些部分工作正常,但dbml似乎不會切換連接字符串。 我使用這個功能的實用工具類

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 

這適用於在這個傳統的應用程序存儲特效的無數裏面,但dbml的,似乎始終使用臨時連接字符串。

當我查看DBML的屬性,我看到它是硬編碼到臨時ConnectionString的,但我想我是通過改變designer.vb的DBML這樣

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 

overridding這有什麼我可以做的,以強制dbml使用正確的連接字符串基於Web.config條目?

回答

9

我會在DataContext的部分類中使用工廠方法。請記住,DataContext的連接字符串不同於常規的ADO.NET連接字符串。

代碼....我從來沒有使用VB.NET,但它應該是這樣的:

Partial Public Class MyDataContext 

    ' GetConnectionString code here 
    ' 

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

使用,而不是使用新MyDataContext()這一點。

或者,你可以調用

dc = New MyDataContext(GetConnectionString()) 

無處不在,你得到一個新的實例,但我更喜歡工廠方法。

其基本思想與您的子類相同,但不需要混淆的額外類名。對於Entity Framework(或任何代碼生成工具),部分類非常有用。您可以將業務邏輯方法添加到實體框架生成的類中,等等。

+0

我不選擇使用VB。我是一個C#人。這個特定的應用程序在VB.NET和.NET 1.1中編碼。我們建議用C#重寫它,並且由於時間限制被擊落。 :(感謝您的回答。 – Hcabnettek 2009-07-10 19:36:48