如何在EF5中动态传递连接字符串

时间:2013-07-11 10:56:54

标签: wpf vb.net entity-framework-5

我正在努力解决一个项目,转换为.net 4.5。

我有一些这样的功能:

Public Shared Function Load(iJaar As Integer, iKwartaal As Integer) As List(Of LoonDetail_121)
    Dim oLoonDetails As New List(Of LoonDetail_121)
    Try
         Dim oDB As New SDWMasterSDWDBEntities(DBConnections.ConnStringPrisma)
         Dim dStartDate As New Date(iJaar, ((iKwartaal - 1) * 3) + 1, 1)
         Dim dEndDate As New Date(iJaar, ((iKwartaal - 1) * 3) + 4, 1)

         oLoonDetails = oDB.LoonDetail_121.Where(Function(x) x.EindPeriode_121 >= dStartDate And
                                              x.EindPeriode_121 < dEndDate).ToList
     Catch ex As Exception
         Throw New Exception(GetCurrentMethod.Name & " " & ex.Message)
     End Try
     Return oLoonDetails
 End Function

当我将此函数转换为EF5时,我得到错误,因为我的SDCDBLonenEntities不再从ObjectContext继承,但它继承自DbContext。
之前,EF自动创建了一个构造函数,我可以在其中传递我的连接字符串。 这非常简单,因为我使用不同的连接字符串,具体取决于我的解决方案配置(调试/发布) 在EF5中,构造函数不再接受Connectionstrings。 我试图创建一个我的实体的部分类,并创建我自己的构造函数,但我不能让它工作:

Partial Public Class SDWMasterSDWDBEntities
    Inherits DbContext

    Public Sub New(sConnString As String)
        MyBase.New(sConnString)
    End Sub
End Class

对于另一个项目,我调整了我的项目文件,为每个解决方案配置使用不同的app.config文件,但这是一个p.i.t.a来维护,对我来说不是一个干净的解决方案。

所以我的问题是:如何在我自己的个人Connectionstring中使用EF5?

顺便说一下,这些是我的连接字符串:

#If DEBUG Then
    Friend ConnStringSDW As String = "metadata=res://*/Entities.SDWDB.csdl|res://*/Entities.SDWDB.ssdl|res://*/Entities.SDWDB.msl;provider=System.Data.SqlClient;provider connection string='data source=SDWDB01\SDWSQL;initial catalog=SDWDB_DEV;persist security info=True;user id=usr;password=pwd;multipleactiveresultsets=True;App=EntityFramework'"
#Else
    Friend ConnStringSDW As String = "metadata=res://*/Entities.SDWDB.csdl|res://*/Entities.SDWDB.ssdl|res://*/Entities.SDWDB.msl;provider=System.Data.SqlClient;provider connection string='data source=SDWDB01\SDWSQL;initial catalog=SDWDB_PROD;persist security info=True;user id=usr;password=pwd;multipleactiveresultsets=True;App=EntityFramework'"
#End If

我得到错误“实体类型SDW_USERS_MASTER不是当前上下文的模型的一部分。”,当我执行此函数时:

Public Shared Function LoadAll() As List(Of SDW_USERS_MASTER)
    Dim oUsers As New List(Of SDW_USERS_MASTER)
    Try
        Using oDB As New SDWMaster.SDWMasterSDWDBEntities(DBConnections.ConnStringSDW)
            oUsers = (From tmpUsers In oDB.SDW_USERS_MASTER
                         Select tmpUsers).ToList.OrderBy(Function(x) x.Login).ToList
        End Using
    Catch ex As Exception
        Debug.Print(ex.Message)
        Throw New Exception(GetCurrentMethod.Name & " " & ex.Message)
    End Try
    Return oUsers
End Function

1 个答案:

答案 0 :(得分:0)

创建一个与您的上下文同名的新分部类,然后重载构造函数。因此,如果您的上下文类被命名为“myContext”,那么您将拥有:

Imports System
Imports System.Data.Entity
Imports System.Data.Entity.Infrastructure
Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Imports System.Linq

Partial Public Class myContext
  Inherits DbContext

  Public Sub New(connectionString As String)
    MyBase.New(connectionString)
  End Sub

End Class