LinqToSql dbml 动态切换连接字符串

6
我们有两个数据库,DEV和STAGING。它们在大部分情况下是相同的。我在Web.Config中有一个app settings标签,叫做"mode",以及两个连接字符串条目。
如果mode=DEV,则要使用ConnectionString 1,否则使用ConnectionString 2。这在应用程序的某些部分中可以正常工作,但dbml似乎没有切换连接字符串。 我正在一个Utilities类中使用此功能。
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似乎总是使用Staging连接字符串。当我查看dbml的属性时,我发现它被硬编码为Staging连接字符串,但是我认为通过更改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条目的正确连接字符串吗?
2个回答

9

我建议在DataContext的partial class中使用工厂方法。需要注意的是,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

使用它来代替New MyDataContext()

或者,你可以调用

dc = New MyDataContext(GetConnectionString())

无论在哪里获取新实例,但我更喜欢工厂方法。

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


我不是出于自愿使用VB,我是一个C#程序员。这个特定的应用程序是用VB.NET和.NET 1.1编写的。我们建议用C#重新编写它,但由于时间限制而被拒绝了。:( 谢谢你的回答。 - Hcabnettek
这个非常棒!!!我使用了工厂方法并将所有内容更新为Dim db as myDataContext = myDataContext.Create。我猜shared和c#的Static类似,因为该方法在Intellisense中显示。感谢您提供的绝佳解决方案!! - Hcabnettek
这实际上是从一些 C# 代码转换而来的。我的意图是在 VB.NET 中创建一个静态方法。 - Thorarin

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接