【问题标题】:LinqToSql dbml dynamically switch connectionstringLinqToSql dbml 动态切换连接字符串
【发布时间】:2009-07-10 18:55:09
【问题描述】:

我们有两个数据库,DEV 和 STAGING。它们大部分是相同的。我在 Web.Config 中有一个应用设置标签,称之为“模式”,还有两个连接字符串条目。

如果 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 似乎总是使用暂存连接字符串。

当我查看 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 条目使用正确的连接字符串吗?

【问题讨论】:

    标签: linq-to-sql web-config connection-string


    【解决方案1】:

    我会在 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
    

    使用它而不是使用 New MyDataContext()

    或者,您可以调用

    dc = New MyDataContext(GetConnectionString())
    

    到处都有一个新实例,但我更喜欢工厂方法。

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

    【讨论】:

    • 我不选择使用 VB。我是一个 C# 人。这个特殊的应用程序是用 VB.NET 和 .NET 1.1 编写的。我们建议用 C# 重写它,但由于时间限制被击落。 :( 谢谢你的回答。
    • 这很好用!!!我使用工厂方法并将所有内容更新为 Dim db,因为 myDataContext = myDataContext.Create 我猜 shared 类似于 c# Static,因为该方法显示在 Intellisense 中。感谢您的出色解决方案!
    • 这实际上是从一些 C# 代码转换而来的。我的意图是在 VB.NET 中创建一个静态方法,是的:)
    【解决方案2】:

    我更喜欢这个解决方案。您可以将 .dbml 设计器设置为不设置默认的空构造函数,然后使用部分类来创建默认构造函数。 http://blogs.msdn.com/b/jongallant/archive/2007/11/25/linq-and-web-application-connection-strings.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2016-06-22
      • 2018-09-20
      相关资源
      最近更新 更多