在WPF应用程序

时间:2016-11-21 18:52:16

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

我有一个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

实现:

  • App.config包含连接字符串和名称
  • 添加了与实体类同名的部分类:

    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

1 个答案:

答案 0 :(得分:1)

我认为您应该在将连接字符串传递给构造函数时删除引号。您想使用变量内容,而不是变量名。

使用此:

Using context = New MyEntity(entityConnStr)

而不是:

Using context = New MyEntity("entityConnStr")