Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用ClickOnce正确部署WPF应用程序和sqlite数据库_Wpf_Sqlite_Clickonce_Publish - Fatal编程技术网

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

如何使用ClickOnce正确部署WPF应用程序和sqlite数据库,wpf,sqlite,clickonce,publish,Wpf,Sqlite,Clickonce,Publish,我尝试使用ClickOnce,但不包括数据库 当我将数据库属性“build action”更改为内容时,它在发布文件属性中可见 不幸的是,在这种情况下,我收到以下错误: 生成清单时出现错误2。进程无法访问文件“H:\Repos\installmentsmanagement\Installments.Wpf\Database\Installments.sqlite”,因为其他进程正在使用该文件。分期付款 我的连接字符串是: <connectionStrings> <

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

当我将数据库属性“build action”更改为内容时,它在发布文件属性中可见

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

生成清单时出现错误2。进程无法访问文件“H:\Repos\installmentsmanagement\Installments.Wpf\Database\Installments.sqlite”,因为其他进程正在使用该文件。分期付款

我的连接字符串是:

  <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>

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

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

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


您可能只需要删除启动时的
onstart
方法;这就是破坏一切的原因。

我正在使用实体框架。我从OnStartup函数中删除了代码。我删除了数据库文件夹并将installments.sqlite移到了它的外部,更改了连接字符串,但publish仍然没有复制该文件。我怀疑有什么东西(很可能是您自己的代码)正在打开installments.sqlite而没有关闭它。找到那个东西可能需要物理访问您的开发机器。可能会在这方面帮助你。对不起,当我把构建操作添加到内容时,它与你的建议一起成功了-谢谢
    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);      
    }