2016-03-07 128 views
2

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

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

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**. 

我使用这个类部署.dacpac

哪一个当然是我的本地开发路径。

我正在使用: DacDeployOptions.IncludeCompositeObjects但没有任何更改。

回答

3

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

  • 的同一目录dacpac放在所以,如果你的编译系统会将dacpac和1个目录的引用,部署将工作
  • 作为回退机制的原始文件路径

实质上,您应该确保在部署之前,dacpac和所有引用位于1个目录中。构建系统应该自动为你做这件事,但如果没有,你应该更新以复制到一个目录(或创建一个Nuget包作为构建的一部分,为你做这一切)。

+0

刚刚尝试过,它的工作原理 – Raffaeu