2009-07-10 58 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