我有一个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 但没有任何变化。
答案 0 :(得分:3)
Dacpacs将按以下顺序查找引用的程序集:
基本上,在部署之前,您应该确保dacpac和所有引用都在1目录中。构建系统应该自动为您执行此操作,但如果不是,您应该更新以复制到目录(或创建一个nuget包作为构建的一部分,为您完成所有这些)。