部署 .dacpac 缺少程序集引用

Deploy .dacpac missing assembly reference

我有一个 SSDT(Sql 服务器数据库项目),它引用外部 .dll(C# Class 库)以提供一些 CLR 功能。 如果我 Deploy/Publish 在本地一切正常,但远程使用 Microsoft.SqlServer.Dac.DacPackage 它会爆炸。

经进一步排查,问题出在生成的.dacpac里面。我的 .dacpac 文件有一个 "hardcoded" 参考路径,它指的是我的本地 DEV 环境,但是当它在 TFS 上运行时,源路径不同。

我使用这个 class:

部署 .dacpac
    var file = FileFinder.GetFirstFile("MyFile.dacpac");
    var package = DacPackage.Load(file);
    var deployOptions = new DacDeployOptions
    {
        BlockOnPossibleDataLoss = false,
        CreateNewDatabase = true,
        IncludeCompositeObjects = true
    };

    var dacService = new DacServices(ApplicationConfiguration.GetConnection("MyConn"));            

    dacService.Deploy(
        package: package,
        targetDatabaseName: "MyDB", 
        upgradeExisting: true, 
        options: deployOptions);
}

远程错误始终相同,即使 .dll 与 .dacpac 文件位于同一文件夹中也是如此:

No file was supplied for reference Utilities.dll; 
deployment might fail. 
When C:\MyFile.dacpac was created, the original referenced file was located **C:\DEV\MAIN\UTILITIES.DLL**.

这当然是我的本地开发路径。

我正在使用: DacDeployOptions.IncludeCompositeObjects 但没有任何变化。

Dacpacs 将按以下顺序查找引用的程序集:

  • 与放置 dacpac 的目录相同。因此,如果您的构建系统将 dacpac 和引用复制到 1 个目录,部署将起作用
  • 原始文件路径,作为回退机制

基本上,在部署之前,您应该确保 dacpac 和所有引用都在 1 个目录中。构建系统应该自动为您执行此操作,但如果没有,您应该更新以复制到目录(或创建一个 nuget 包作为构建的一部分,为您执行所有这些操作)。