5

Je suis en train de construire un script pour un assez gros projet. L'un des projets nécessite qu'un modèle de cadre d'entité soit compilé dans une bibliothèque. En raison du fonctionnement du serveur de construction, toutes les versions sont fabriquées à la main pour gérer les différents scénarios de déploiement sans affecter les développeurs et les fichiers de projet.Utilisez MSBuild pour créer un modèle de cadre d'entité sans utiliser le fichier de projet?

Est-il possible de générer le modèle EF à l'aide d'une tâche MSBuild sans utiliser le fichier de projet généré par Visual Studio? Actuellement, l'assemblage réel se compile à l'aide d'une tâche CSC, mais l'application déployée réelle échoue car le modèle EF n'est pas inclus dans l'assemblage compilé.

Des pointeurs dans lesquels des cibles ou des tâches de construction peuvent être utilisées pour générer le modèle et créer les ressources requises à intégrer dans l'assemblage?

S'il vous plaît noter

Le projet compile bien dans Visual Studio, mais en utilisant le fichier de projet sur le serveur de build est pas une option, car il y a divers changements qui doivent être apportés au projet au moment du déploiement , et ceci est contrôlé par un script de construction personnalisé en dehors du contrôle des équipes de développement. Cela a fonctionné avec succès pour quelques projets, mais le modèle EF cause des maux de tête dans ce scénario spécifique.

Mise à jour

La solution actuelle est pas idéal, mais fonctionne. Le fichier Projet a été modifié pour copier les ressources du modèle EF dans un dossier du projet sur une nouvelle version, qui est ensuite vérifiée dans le contrôle source. Lorsque le script de build s'exécute sur le serveur, les modèles EF sont intégrés dans l'assemblage. Cela semble être une solution de contournement pour le moment.

Répondre

4

Je l'ai effectivement traité aujourd'hui car l'arborescence source de mon projet n'est pas correctement configurée pour exécuter la tâche de construction d'Entity Framework qui génère et incorpore les ressources dans la DLL de sortie.

I ont étudié les options suivantes:

Utilisation de la tâche msbuild EntityDeploy

Si vous ouvrez votre fichier .csproj dans le bloc-notes, vous devriez voir un peu de XML comme

<EntityDeploy Include="MyEntities.edmx"> 
    <Generator>EntityModelCodeGenerator</Generator> 
    <LastGenOutput>MyEntities.Designer.cs</LastGenOutput> 
</EntityDeploy> 

Cette est la tâche msbuild qui utilise Microsoft.Data.Entities.Build.targets et Microsoft.Data.Entities.Build.dll pour lire le fichier edmx, générer les fichiers ssdl, csdl et msl, puis les incorporer dans la DLL cible. (Ces fichiers peuvent être trouvés dans C: \ Windows \ Microsoft.NET \ Framework \ v3.5).

En utilisant EdmGen

Comme Craig a fait remarquer, vous pourriez être en mesure d'utiliser EdmGen.exe qui est livré avec le cadre. J'ai essayé mais j'ai fait un peu de personnalisation des données dans mon fichier edmx et EdmGen.exe semble vraiment vouloir faire la génération initiale de la base de données originale.

En utilisant EdmGen2

EdmGen2.exe est un projet open source qui fait un peu plus de EdmGen. J'ai fini par l'utiliser pour générer les fichiers ssdl, csdl et msl. Vous pouvez simplement le pointer sur votre fichier edmx et il va générer les fichiers ssdl, csdl et msl nécessaires. Je puis repris ces éléments aux côtés de mon dll et modifié la chaîne de connexion de

connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl; 

à

connectionString="metadata=./MyEntities.csdl|./MyEntities.ssdl|./MyEntities.msl; 

note Je dis Entity Framework que ces fichiers se trouvent dans le même répertoire que mon dll, pas EMBEDDED comme ressources.

Tous les trois, la tâche de génération, EdmGen et EdmGen2 sont des wrappers minces qui appellent System.Data.Entity.dll pour toutes les tâches difficiles. En dernier recours, vous pouvez jeter un oeil à la tâche de construction dll dans le réflecteur et voir ce qu'il fait.

Espérons que cela aide.

1

Oui, il existe un utilitaire de ligne de commande appelé EdmGen qui peut faire cela. Utilisez EdmGen /? pour les commutateurs possibles.

Questions connexes