2016-03-07 1 views
2

J'ai un SSDT (Sql Server Database Project) qui fait référence à un fichier .dll externe (bibliothèque de classes C#) afin de fournir certaines fonctions CLR. Si je déploie/publie localement tout fonctionne correctement, mais à distance, en utilisant Microsoft.SqlServer.Dac.DacPackage il bombes. Le problème, après un examen plus approfondi, est à l'intérieur du fichier .dacpac généré. D'une certaine manière mon fichier .dacpac a un chemin de référence "codé en dur" qui fait référence à mon environnement DEV local mais quand il s'exécute sur TFS, le chemin source est différent.Deploy .dacpac manquant référence d'assembly

Je Déployez le .dacpac en utilisant cette classe:

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); 
} 

et à distance l'erreur est toujours le même, même si les fichiers .dll sont dans le même dossier du fichier .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**. 

Ce qui est bien sûr mon chemin de développement local. J'utilise: DacDeployOptions.IncludeCompositeObjects mais rien ne change.

Répondre

3

Dacpacs chercheront des assemblages référencés dans l'ordre suivant:.

  • Le même répertoire que le dacpac est placé dans Donc, si votre build système copie Le dacpac et les références à 1 répertoire, déployer fonctionnera
  • Le chemin du fichier d'origine, en tant que mécanisme de secours

Vous devriez essentiellement vous assurer qu'un dacpac et toutes les références sont dans 1 répertoire avant le déploiement. Le système de construction devrait le faire pour vous automatiquement, mais sinon vous devriez mettre à jour pour copier dans un répertoire (ou créer un paquet nuget dans le cadre de la compilation qui fait tout cela pour vous).

+0

Juste essayé et ça marche – Raffaeu