Linq to sql LinqToSql dbml动态切换连接字符串

Linq to sql LinqToSql dbml动态切换连接字符串,linq-to-sql,web-config,connection-string,Linq To Sql,Web Config,Connection String,我们有两个数据库,DEV和STAGING。它们在很大程度上是相同的。我在Web.Config中有一个appsettings标记,称之为“mode”,还有两个connectionstring条目 如果mode=DEV,我想使用ConnectionString 1,否则使用ConnectionString 2。这在应用程序的某些部分工作正常,但dbml似乎没有切换连接字符串。 我在实用程序类中使用此函数 Public Function GetConnectionString() As String

我们有两个数据库,DEV和STAGING。它们在很大程度上是相同的。我在Web.Config中有一个appsettings标记,称之为“mode”,还有两个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的属性时,我看到它是硬编码到Staging connectionstring的,但是我认为我通过如下更改dbml的designer.vb来覆盖它

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基于Web.config条目使用正确的connectionstring吗

我会在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())
在任何地方都会有一个新实例,但我更喜欢工厂方法


基本思想与子类化相同,但不需要令人困惑的额外类名。当涉及实体框架(或任何代码生成工具)时,分部类非常有用。您可以将业务逻辑方法添加到实体框架生成的类中,等等。

我更喜欢这个解决方案。可以将.dbml设计器设置为不设置默认空构造函数,然后使用分部类创建默认构造函数。

我没有选择使用VB。我是一个C#guy。这个特定的应用程序是用VB.NET和.NET 1.1编写的。我们建议用C#重写它,但由于时间限制,它被否决了(感谢您的回答。这非常好!!!我使用了工厂方法,并将所有内容更新为Dim db作为myDataContext=myDataContext。我猜Create shared类似于c#Static,因为该方法在Intellisense中显示。感谢伟大的解决方案!!这实际上是从一些c#代码转换而来的。我的目的是创建一个静态方法VB.NET中的od是:)