MSBuild 在发布数据库时忽略 p-Switch

MSBuild ignores p-Switch when publishing database

我已经在 VS 2015 中通过 SSDT 创建了一个针对 SQL Azure V12 服务器的发布配置文件,现在我想使用控制台发布数据库。我正在使用以下命令:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe  
    /t:Publish 
    /p:TargetDatabaseName=NEWDBNAME        
    /p:SqlPublishProfilePath="PublishProfiles\test.publish.xml" 
    "{PATH_TO_MY_SSDT\{PROJECTNAME}.sqlproj"

我的个人资料如下所示(花括号在这里只是实际值的占位符):

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <IncludeCompositeObjects>True</IncludeCompositeObjects>
    <TargetDatabaseName>DBNAME</TargetDatabaseName>
    <DeployScriptFileName>Data.Database.sql</DeployScriptFileName>
    <BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
    <CreateNewDatabase>True</CreateNewDatabase>
    <ProfileVersionNumber>1</ProfileVersionNumber>
    <TargetConnectionString>Data Source={SERVER};Persist Security Info=True;User ID={USER};Password={PW};Pooling=False</TargetConnectionString>
  </PropertyGroup>
  <ItemGroup>
    <SqlCmdVariable Include="BaseData">
      <Value>1</Value>
    </SqlCmdVariable>
    <SqlCmdVariable Include="SampleData">
      <Value>1</Value>
    </SqlCmdVariable>
  </ItemGroup>
</Project>

这每次都会创建一个数据库 "DBNAME",而不是用值 "NEWDBNAME" 替换 属性 TargetDatabaseName。其他一切正常。

为什么 msbuild 会保留 属性 不变?

编辑:

我做了一些测试并尝试了以下方法(在 Christian K.s 评论之后):

测试 1:添加诊断

C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe  
    /t:Publish 
    /p:TargetDatabaseName=NEWDBNAME        
    /p:SqlPublishProfilePath="PublishProfiles\test.publish.xml" 
    "{PATH_TO_MY_SSDT\{PROJECTNAME}.sqlproj" 
    /v:diag 
    /fl

输出中有一节显示参数。这是屏幕截图:

测试 2:更改 UpdateDatabase 以进行测试

C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe  
    /t:Publish 
    /p:TargetDatabaseName=NEWDBNAME        
    /p:SqlPublishProfilePath="PublishProfiles\test.publish.xml" 
    /p:UpdateDatabase=false 
    "{PATH_TO_MY_SSDT\{PROJECTNAME}.sqlproj" 
    /v:diag 
    /fl

如您所见,UpdateDatabase 已正确更改,TargetDatabaseName 未出现在属性列表中。

调用 exec 任务真的要简单得多 sqlpackage.exe - 我将 sqlpackage 文件夹 MSSQL\VER\DAC\bin 检查到我的解决方案中,这样我就可以使用构建文件夹中的相对路径,你可以部署从有或没有 SQL 的任何服务器。

我得到了解决方案。我只是将我的发布配置文件中的 CreateNewDatabase 设置为 false 并且它起作用了。

Edit: 它只工作一次,因为在那之后这个过程被简单地跳过了,因为数据库已经存在。现在的解决方案是在我按照 Kris 在他的评论中建议的代码通过代码执行它之前编辑 publish.xml 。

这是 SQL 服务器与 SQL Azure 之间不兼容的另一个示例,这在我看来很烦人。