Wix,创建数据库并运行迁移

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wix,创建数据库并运行迁移相关的知识,希望对你有一定的参考价值。

我们使用Fluent Migrator在我们的WPF应用程序中迁移SQL Server数据库。现在我使用Wix Toolset制作安装程序,并尝试将迁移添加为安装的一部分。

我有一个自定义操作执行迁移和一个带有SqlDatabase标记的组件,用于创建数据库。如果我在安装期间指向现有数据库并且如果选择不存在的数据库,则数据库创建工作正常,则迁移工作正常。但是将它们一起运行我得到一个SQL Server错误。

*Cannot open database "Database" requested by the login. The login failed.
Login failed for user 'User'.!*

创建MigrationRunner时发生错误:

new MigrationRunner(migrationsAssembly, migrationContext, processor);

SqlDatabase如下所示:

<sql:SqlDatabase Id='SqlDatabase.IntegratedAuthentication' 
    Database='[DATABASE_NAME]' 
    Server='[DATABASE_SERVER]' 
    CreateOnInstall='yes' 
    DropOnUninstall='no' 
    ContinueOnError='no' />

在我的日志中,我可以看到CreateDatabase操作在迁移开始之前完成,是否有人知道为什么会发生这种情况或如何绕过它?

答案

您的示例似乎缺少sql:SqlScript元素的BinaryKey属性?

这是我写的一个工作脚本的摘录。

首先,定义要运行的脚本。 (即BinaryKey属性的值)

<Binary Id="CreateTablesBin" SourceFile="Database[CreateScript]"></Binary>
<Binary Id="FillTablesBin" SourceFile="Database[DataScript]"></Binary>
<Binary Id="DropTablesBin" SourceFile="Database[RollbackScript]"></Binary>

然后定义一个功能来运行数据库脚本。

<Feature Id="ProductFeature" Title="DB Server Setup" Level="1">
  <ComponentGroupRef Id="MyWebComponents"/>
  <ComponentGroupRef Id="IISConfiguration"/>
  <Component Id="IntegratedSecurity" Guid="[GUID Here]" Directory="INSTALLFOLDER">
    <sql:SqlDatabase Id="mysqlDatabase" Database="[DATABASE_NAME]" Server="[DATABASE_SERVER]" CreateOnInstall="yes" DropOnUninstall="yes" ContinueOnError="yes"> <!-- Don't specify user for Integrated Authentication / Win Authentication -->
      <sql:SqlScript Id="CreateTables" ExecuteOnInstall="yes" ExecuteOnUninstall="no" BinaryKey="CreateTablesBin" ContinueOnError="no" />
      <sql:SqlScript Id="FillTables" ExecuteOnInstall="yes" ExecuteOnUninstall="no" BinaryKey="FillTablesBin"  ContinueOnError="no"/>
      <sql:SqlScript Id="DropTables" ExecuteOnInstall="no" ExecuteOnUninstall="yes" BinaryKey="DropTablesBin"  ContinueOnError="yes"/>
    </sql:SqlDatabase>
    <CreateFolder/>
  </Component>     
</Feature>

我不确定你是否需要2个ComponentGroupRef元素。我已经包含在这里以防万一它需要。

以上是关于Wix,创建数据库并运行迁移的主要内容,如果未能解决你的问题,请参考以下文章

wix - 错误CNDL0004:从命令行运行时,file元素包含意外的属性“src”

如何设置 wix msi 以运行管理员广告

安装后,C#应用程序(使用WIX创建的安装程序)不会运行

在 WIX 迁移中管理用户配置

Wix XmlFile 元素执行得太早

Wix Heat 输出没有像我想要的那样引用目录