我有一个WPF应用程序,我想在应用程序加载时以编程方式更改连接字符串。我使用数据库优先方法进行EF。
我花了很多时间实现在线发现的各种解决方案,包括堆栈溢出,似乎无法让它工作。
最常见的方法似乎是修改Entity分部类。当我这样做时,我在运行时收到以下错误:
附加信息:上下文正在Code First模式中使用,其代码是从EDMX文件生成的,用于Database First或Model First开发。这将无法正常工作。要解决此问题,请不要删除引发此异常的代码行。如果您希望使用Database First或Model First,请确保Entity Framework连接字符串包含在启动项目的app.config或web.config中。如果要创建自己的DbConnection,请确保它是EntityConnection而不是其他类型的DbConnection,并将其传递给采用DbConnection的基本DbContext构造函数之一。要了解有关Code First,Database First和Model First的更多信息,请参阅此处的实体框架文档:http://go.microsoft.com/fwlink/?LinkId=394715
我在实现其他各种方法时遇到了同样的错误。如果有人可以帮我实现一种在运行时更改连接字符串的方法,我非常感激。
我当前的实现取自此示例解决方案: Changing Databases at Run-time using Entity Framework
实现:
添加了与实体类同名的部分类:
Imports System.Data.Entity
Imports System.Data.EntityClient
Imports System.Data.SqlClient
Partial Public Class MyEntityName
Inherits DbContext
Public Sub New(ByVal connString As String)
MyBase.New(connString)
End Sub
End Class
在我的Application.xaml代码文件中,我通过调用构建EntityConnectionStringBuilder的方法设置了一个全局字符串变量。然后将此全局字符串变量传递给实体构造函数。
Imports System.Reflection
Imports DevExpress.Xpf.Core
Imports System.Data.EntityClient
Class Application
Public Sub New()
entityConnStr = BuildConnectionString("[MyDataSource]", "[MyDatabase]")
End Sub
Private Function BuildConnectionString(ByVal DataSource As String, ByVal Database As String) As String
' Build the connection string from the provided datasource and database
Dim connString As String = "data source=" & DataSource & ";initial catalog=" & Database & ";persist security info=True;user id=[user];password=[password];trustservercertificate=True;MultipleActiveResultSets=True;App=EntityFramework""
' Build the MetaData... feel free to copy/paste it from the connection string in the config file.
Dim esb As New EntityConnectionStringBuilder()
esb.Metadata = "res://*/DB.[MyEntityName].csdl|res://*/DB.[MyEntityName].ssdl|res://*/DB.[MyEntityName].msl"
esb.Provider = "System.Data.SqlClient"
esb.ProviderConnectionString = connString
' Generate the full string and return it
Return esb.ToString()
End Function
用法:
Using context = New MyEntity("entityConnStr")
公共连接变量字符串:
Public entityConnStr As String
答案 0 :(得分:1)
我认为您应该在将连接字符串传递给构造函数时删除引号。您想使用变量内容,而不是变量名。
使用此:
Using context = New MyEntity(entityConnStr)
而不是:
Using context = New MyEntity("entityConnStr")