2009-07-10 41 views
6

DEVとSTAGINGという2つのデータベースがあります。それらはほとんど同じです。私はWeb.Configに "モード"と2つの接続文字列を呼び出すアプリケーション設定タグを持っています。LinqToSql dbml動的に接続する接続文字列

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 

を、この機能を使用しています。これは、このレガシーアプリで保存されprocsの無数のために動作しますが、DBMLは、常にステージング接続文字列を使用しているようです。

私はDBMLのプロパティを表示すると、私はそれは難しいステージングれたconnectionStringにコード化されていることが分かりますが、私はこの

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 

ようDBMLためdesigner.vbを変更することでこれをオーバーライドすると思いましたWeb.configエントリに基づいて正しい接続文字列を使用するようにdbmlを強制するためにできることはありますか?

答えて

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(またはコード生成ツール)に関しては非常に便利です。 Entity Frameworkで生成されたクラスなどにビジネスロジックメソッドを追加できます。

+0

VBでは選択肢を使用しません。私はC#の男です。この特定のアプリケーションは、VB.NETと.NET 1.1でコード化されています。私たちはC#でそれを書き直すことを提案しました。あなたの答えをありがとう – Hcabnettek

+0

これは私がそれを行う方法です – mattruma

+0

これは素晴らしいです!!!私は工場のメソッドを行って、すべてのDimデータベースをmyDataContext = myDataContext.Createとして更新しました 私は共有がC#Static – Hcabnettek

関連する問題