0

我目前正在尝试分发一个依赖于.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=&quot;data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\database\Db.mdf;integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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
    ...

就像它是由实体框架生成的一样。

我对如何解决这个问题的想法已经不多了。

4

1 回答 1

0

好的,问题原来是|DataDirectory|

我使用我选择使用的正确的一键式数据目录手动替换连接字符串中的此条目:

Dim dataDir As String
If ApplicationDeployment.IsNetworkDeployed Then
    Dim ad = ApplicationDeployment.CurrentDeployment
    dataDir = ad.DataDirectory
Else
    dataDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
End If

加载数据库文件没有问题了。我不能说为什么更换|DataDirectory|不起作用。对于开发计算机上的版本,这只是用空字符串替换......这是有效的,因为工作目录是所引用数据库目录的父目录。

但是,在使用 ClickOnce 时,包括数据库在内的数据文件位于不同的目录中。这会导致连接字符串失败。上面的代码解决了这个问题。我无法解释为什么这不是开箱即用的。

于 2013-10-09T12:13:05.610 回答