LinqToSql dbml динамически переключает строку подключения - PullRequest
6 голосов
/ 10 июля 2009

У нас есть две базы данных, 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, похоже, всегда использует строку соединения Staging.

Когда я просматриваю свойства dbml, я вижу, что он жестко запрограммирован в строку соединения Staging, но я подумал, что переопределил это, изменив файл 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

Что я могу сделать, чтобы заставить dbml использовать правильную строку соединения, основанную на записи Web.config?

Ответы [ 2 ]

9 голосов
/ 10 июля 2009

Я бы использовал фабричный метод в частичном классе для 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())

везде, где вы получаете новый экземпляр, но я предпочитаю фабричный метод.

Основная идея та же, что и для подкласса, но без необходимости вводить в заблуждение дополнительное имя класса. Частичные классы очень полезны, когда дело доходит до Entity Framework (или любых инструментов генерации кода). Вы можете добавить методы бизнес-логики в сгенерированные классы Entity Framework и т. Д.

0 голосов
/ 07 июля 2011

Мне больше нравится это решение. Вы можете настроить дизайнер .dbml так, чтобы он не устанавливал пустой конструктор по умолчанию, а затем использовать частичный класс для создания конструктора по умолчанию. http://blogs.msdn.com/b/jongallant/archive/2007/11/25/linq-and-web-application-connection-strings.aspx

...