【问题标题】:How to dynamically pass connectionstrings in EF5如何在 EF5 中动态传递连接字符串
【发布时间】:2013-07-09 14:49:03
【问题描述】:

我正在为一个转换为 .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,对我来说不是一个干净的解决方案。

所以我的问题是:如何将 EF5 与我自己的个人连接字符串一起使用?

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

#如果调试然后 朋友 ConnStringSDW As String = "metadata=res://*/Entities.SDWDB.csdl|res://*/Entities.SDWDB.ssdl|res://*/Entities.SDWDB.msl;provider=System.Data. SqlClient;提供者连接字符串='数据源=SDWDB01\SDWSQL;初始目录=SDWDB_DEV;持久安全信息=True;用户id=usr;密码=pwd;multipleactiveresultsets=True;App=EntityFramework'" #别的 朋友 ConnStringSDW As String = "metadata=res://*/Entities.SDWDB.csdl|res://*/Entities.SDWDB.ssdl|res://*/Entities.SDWDB.msl;provider=System.Data. SqlClient;提供者连接字符串='数据源=SDWDB01\SDWSQL;初始目录=SDWDB_PROD;持久安全信息=True;用户id=usr;密码=pwd;multipleactiveresultsets=True;App=EntityFramework'" #万一

当我执行此函数时,我收到错误“实体类型 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

【问题讨论】:

  • 我已经找到了以下内容:visualstudiogallery.msdn.microsoft.com/…,但这只会改变自动生成代码的创建方式。我还没有尝试过,因为这是“回到旧的方式”,微软不建议这样做......
  • 如果数据库架构相同,您应该能够使用调试和发布 web 或应用程序配置来更改它指向的数据库。

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


【解决方案1】:

创建一个与上下文同名的新部分类,然后重载构造函数。因此,如果您的上下文类名为“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

【讨论】:

  • 这就是我所做的,但我一直有错误“实体类型 SDW_USERS_MASTER 不是当前上下文模型的一部分。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2021-12-27
  • 2011-04-02
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多