如何使用ClickOnce正确部署带有sqlite数据库的WPF应用程序

时间:2015-06-25 22:26:23

标签: wpf sqlite clickonce publish

我尝试使用ClickOnce但不包括数据库。

当我将数据库属性“构建操作”更改为内容时,它在“发布文件属性”中可见。

https://msdn.microsoft.com/en-us/library/kzy0fky2.aspx

不幸的是在这种情况下我收到以下错误:

错误2生成清单时出现问题。该进程无法访问文件'H:\ Repos \ InstalmentsManagement \ Installments.Wpf \ Database \ installments.sqlite',因为它正由另一个进程使用。 Installments.Wpf

我的连接字符串是:

  <connectionStrings>
    <add name="installmentsEntities" connectionString="metadata=res://*/InstallmentsModel.csdl|res://*/InstallmentsModel.ssdl|res://*/InstallmentsModel.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=|DataDirectory|\Database\installments.sqlite&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

此外,我在启动时关注以检测datadirecory:

    protected override void OnStartup(StartupEventArgs e)
    {
        string executable = System.Reflection.Assembly.GetExecutingAssembly().Location;
        string path = (System.IO.Path.GetDirectoryName(executable));
        AppDomain.CurrentDomain.SetData("DataDirectory", path);

        base.OnStartup(e);      
    }

1 个答案:

答案 0 :(得分:1)

如果您收到“进程无法访问”本地数据文件,您可能是自己打开它而不是关闭它。

ClickOnce将|DataDirectory|定义为安装程序数据文件夹。如果您的连接字符串为|DataDirectory|\Database\installments.sqlite,那么您需要将项目的Database文件夹而不是installments.sqlite文件标记为数据文件。或者您可以将连接字符串更改为|DataDirectory|\installments.sqlite

SetData没有“检测”DataDirectory,它取代了它。请勿拨打SetData,因为这将取代ClickOnce的值。如果您需要知道安装程序目标数据文件夹,可以调用AppDomain.CurrentDomain.GetData("DataDirectory"),但如果您使用的是ADO.NET,则甚至不需要这样做; ADO.NET将使用安装程序数据文件夹的路径替换连接字符串中的|DataDirectory|

您可能只需要删除OnStartup方法;那是什么破坏了事情。