2009-07-10 25 views
6

İki veritabanımız var, DEV ve STAGING. Çoğunlukla aynıdırlar. Web.Config'te bir uygulama ayarları etiketinin "mode" ve iki connectiontring girdisi var.LinqToSql dbml bağlantı geçişlerini dinamik olarak değiştir

Mod = DEV ise, ConnectionString 1 kullanmak istiyorum. Aksi takdirde ConnectionString 2'yi kullanın. Bu, uygulamanın bazı bölümlerinde iyi çalışır, ancak dbml bağlantı dizelerini değiştirmiyor gibi görünmüyor. Bir Kamu sınıfında

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 

Bu, bu eski app saklı procs sayısız için çalışıyor içinde bu işlevi kullanıyorum ama dbml, hep Evreleme bağlantı dizesi kullanmak gibi görünüyor. Ben DBML özelliklerini görüntülediğinizde

, zor Evreleme connectionstring kodlanmış görüyoruz, ama bu

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 

gibi DBML için designer.vb değiştirerek bu ı iptal sandım Web.config girdisine göre doğru bağlantıları kullanmaya dbml zorlamak için yapabileceğim bir şey var mı?

cevap

9

DataContext için kısmi bir sınıfta bir fabrika yöntemi kullanırdım. DataContext için bir bağlantı dizesinin düzenli bir ADO.NET bağlantı dizesinden farklı olduğunu unutmayın.

Kod .... ben VB.NET hiç kullanmadıysanız, ama böyle bir şey olmalı:

Partial Public Class MyDataContext 

    ' GetConnectionString code here 
    ' 

    Public Shared Function Create() As MyDataContext 
     Return New MyDataContext(GetConnectionString()) 
    End Function 
End Class 

Kullanım yerine Yeni MyDataContext() kullanmanın.

Alternatif olarak, yeni bir örneğini almak her yerde

dc = New MyDataContext(GetConnectionString()) 

diyebiliriz ama fabrika yöntemini tercih ediyorum.

Temel fikir, alt sınıflamanızla aynıdır, ancak kafa karıştırıcı bir ekstra sınıf adı gerektirmez. Kısmi sınıflar, Varlık Çerçevesi (veya herhangi bir kod oluşturma aracı) söz konusu olduğunda çok yararlıdır. Varlık Çerçevesi oluşturulmuş sınıflarınıza vb. Iş mantığı yöntemlerini ekleyebilirsiniz.

+0

VB'yi tercihimce kullanmıyorum. Ben bir C# adamım. Bu özel uygulama VB.NET ve .NET 1.1 kodlanmıştır. C# 'de yeniden yazmayı ve vurulmuş zaman kısıtlamaları nedeniyle önerdik. :(Cevabınız için teşekkürler. – Hcabnettek

+0

İşte bu şekilde yapıyorum. – mattruma

+0

Bu harika çalışıyor! Fabrika yöntemlerine gittim ve her şeyi Dim db olarak güncelledim myDataContext = myDataContext.Create Paylaşımın C# Static'e benzer olduğunu düşünüyorum Yöntem Intellisense'de ortaya çıktığı gibi. Büyük çözüm için teşekkürler! – Hcabnettek

İlgili konular