2009-07-10 38 views
6

Chúng tôi có hai cơ sở dữ liệu, DEV và STAGING. Chúng hầu như giống hệt nhau. Tôi có một thẻ cài đặt ứng dụng trong Web.Config gọi nó là "chế độ", và hai mục kết nối chuỗi.LinqToSql dbml tự động chuyển đổi chuỗi kết nối

Nếu chế độ = DEV Tôi muốn sử dụng ConnectionString 1 nếu không sử dụng ConnectionString 2. Điều này hoạt động tốt ở một số phần của ứng dụng, nhưng dbml dường như không chuyển đổi chuỗi kết nối. Tôi đang sử dụng chức năng này bên trong một lớp tiện ích

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 

này làm việc cho vô số các procs được lưu trữ trong ứng dụng của di sản này, nhưng dbml, dường như luôn luôn sử dụng chuỗi kết nối Staging.

Khi tôi xem các thuộc tính của dbml, tôi thấy rằng nó được cứng mã hoá để connectionstring Staging, nhưng tôi nghĩ rằng tôi đã overridding này bằng cách thay đổi designer.vb cho dbml như thế này

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 

Có điều gì tôi có thể làm để buộc dbml sử dụng đúng chuỗi kết nối dựa trên mục nhập Web.config không?

Trả lời

9

Tôi sẽ sử dụng một phương pháp nhà máy trong một lớp từng phần cho DataContext. Hãy nhớ rằng một chuỗi kết nối cho một DataContext khác với một chuỗi kết nối ADO.NET thông thường.

Mã .... Tôi chưa bao giờ sử dụng VB.NET, nhưng nó phải là một cái gì đó như thế này:

Partial Public Class MyDataContext 

    ' GetConnectionString code here 
    ' 

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

Sử dụng thay vì sử dụng New MyDataContext().

Ngoài ra, bạn có thể gọi

dc = New MyDataContext(GetConnectionString()) 

ở khắp mọi nơi bạn nhận được một trường hợp mới, nhưng tôi thích phương pháp nhà máy.

Ý tưởng cơ bản giống với phân lớp con của bạn, nhưng không cần thêm tên lớp phụ khó hiểu. Các lớp một phần rất hữu ích khi nói đến Entity Framework (hoặc bất kỳ công cụ tạo mã) nào. Bạn có thể thêm các phương thức logic nghiệp vụ vào các lớp tạo ra khung Entity của bạn, v.v.

+0

Tôi không sử dụng VB theo lựa chọn. Tôi là một anh chàng C#. Ứng dụng cụ thể này được mã hóa bằng VB.NET và .NET 1.1. Chúng tôi đã đề xuất viết lại nó trong C# và do các ràng buộc về thời gian đã bị bắn hạ. – Hcabnettek

+0

Đây là cách tôi làm điều đó – mattruma

+0

Điều này làm việc tuyệt vời !!! Tôi đã đi các phương pháp nhà máy và cập nhật tất cả mọi thứ để Dim db như myDataContext = myDataContext.Create Tôi đoán chia sẻ tương tự như C# tĩnh như là phương pháp hiển thị trong Intellisense Cảm ơn vì giải pháp tuyệt vời !! – Hcabnettek

Các vấn đề liên quan