我尝试使用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="data source=|DataDirectory|\Database\installments.sqlite"" 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);
}
答案 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
方法;那是什么破坏了事情。