如何使用ClickOnce正确部署WPF应用程序和sqlite数据库
我尝试使用ClickOnce,但不包括数据库 当我将数据库属性“build action”更改为内容时,它在发布文件属性中可见 不幸的是,在这种情况下,我收到以下错误: 生成清单时出现错误2。进程无法访问文件“H:\Repos\installmentsmanagement\Installments.Wpf\Database\Installments.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> <
<connectionStrings>
<add name="installmentsEntities" connectionString="metadata=res://*/InstallmentsModel.csdl|res://*/InstallmentsModel.ssdl|res://*/InstallmentsModel.msl;provider=System.Data.SQLite.EF6;provider connection string="data source=|DataDirectory|\Database\installments.sqlite"" 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);
}