部署.dacpac缺少程序集引用

时间:2016-03-07 15:59:06

标签: c# .net sql-server-data-tools dacpac

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

经过进一步调查后,问题出在.dacpac生成的内部。不知何故,我的.dacpac文件有一个“硬编码”引用路径,它引用我的本地DEV环境但是当它在TFS上运行时,源路径是不同的。

我使用此类部署.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 但没有任何变化。

1 个答案:

答案 0 :(得分:3)

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

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

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