我目前正在尝试分发一个依赖于.NET 中某种形式的数据库的应用程序。我正在尝试使用 SQL Server Express 或 SQL Server Express LocalDB。
为了访问数据库,我使用了实体框架。
现在的目标是创建一个不需要手动对 SQL 服务器进行任何更改的可部署版本。它需要根据需要安装和设置以启动应用程序。在我的开发计算机上一切顺利。一旦部署到另一台计算机,问题就开始了。
我尝试了 LocalDB 以避免在目标机器上手动设置数据库结构的要求。但是,在启动应用程序后,它会报告连接字符串存在问题。attachdbfilename 无效。
此文件名设置为attachdbfilename=|DataDirectory|\database\Db.mdf
如我所说。在我的开发机器上,这是可行的。无论是在使用部署的文件时,还是在从 IDE 运行它时。然而目标机器报告了这个问题。我使用 ClickOnce 和我的应用程序一起安装了 SQL Server Express 2012 LocalDB。部署的文件包含正确目录中的 mdf 文件。
完整的连接字符串是:
<connectionStrings>
<add name="DbContainer" connectionString="metadata=res://*/database.DbModel.csdl|res://*/database.DbModel.ssdl|res://*/database.DbModel.msl;provider=System.Data.SqlClient;provider connection string="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\database\Db.mdf;integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
我看不到 attachdbfilename 无效的原因。目标机器上安装sql server好像没问题。
我还尝试使用普通的 SQL Server 2012 express 来推动它。我如何假设如果我想使用它,没有附加的数据库文件,我需要手动创建所需的数据库。这不是一个选择。
我在一些问题中读到这表明创建存在问题,ObjectContext
但这个问题看起来也不错:
Public Partial Class DbContainer
Inherits ObjectContext
Public Sub New()
MyBase.New("name=DbContainer", "DbContainer")
MyBase.ContextOptions.LazyLoadingEnabled = true
OnContextCreated()
End Sub
Public Sub New(ByVal connectionString As String)
MyBase.New(connectionString, "DbContainer")
MyBase.ContextOptions.LazyLoadingEnabled = true
OnContextCreated()
End Sub
Public Sub New(ByVal connection As EntityConnection)
MyBase.New(connection, "DbContainer")
MyBase.ContextOptions.LazyLoadingEnabled = true
OnContextCreated()
End Sub
...
就像它是由实体框架生成的一样。
我对如何解决这个问题的想法已经不多了。