5

Estoy en proceso de crear un script para un proyecto bastante grande. Uno de los proyectos requiere que se compile un Modelo de Marco de la Entidad en una biblioteca. Debido a la forma en que funciona el servidor de compilación, todas las compilaciones están hechas a mano para administrar los diversos escenarios de implementación sin afectar a los desarrolladores y los archivos del proyecto.¿Usa MSBuild para construir el Modelo de Entidad Marco sin usar el Archivo de Proyecto?

¿Hay alguna forma de generar el Modelo EF utilizando una tarea MSBuild sin usar el archivo de proyecto generado por Visual Studio? Actualmente, el ensamblaje real se compila utilizando una tarea CSC, sin embargo, la aplicación desplegada real falla porque el modelo EF no se incluye en el ensamblado compilado.

¿Alguna sugerencia en la que los Objetivos o las Tareas de compilación se puedan usar para generar el modelo y crear los recursos necesarios para incrustarlos en el ensamblado?

Nota

El proyecto compila bien en Visual Studio, sin embargo con el archivo de proyecto en el servidor de compilación no es una opción, ya que hay varios cambios que necesita ser hecho para el proyecto en tiempo de despliegue , y esto se controla a través de un script de compilación personalizado fuera del control de los equipos de desarrollo. Esto ha funcionado con éxito en algunos proyectos, sin embargo, el Modelo EF está causando algunos dolores de cabeza en este escenario específico.

actualización

La solución actual no es ideal, pero funciona. El archivo del proyecto se ha modificado para copiar los recursos del modelo EF en una carpeta del proyecto en una nueva versión del lanzamiento, que luego se verifica en el control de fuente. Cuando el script de compilación se ejecuta en el servidor, los modelos EF se incrustan en el ensamblaje. Esto parece ser una solución viable por el momento.

Respuesta

4

De hecho, me he ocupado de esto porque el árbol de fuentes de mi proyecto no está configurado correctamente para ejecutar la tarea de compilación de Entity Framework que genera e incorpora los recursos en la dll de salida.

que investigaron las siguientes opciones:

mediante la tarea msbuild EntityDeploy

Si abre el archivo en libreta .csproj debería ver un poco de XML como

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

Este es la tarea msbuild que utiliza Microsoft.Data.Entities.Build.targets y Microsoft.Data.Entities.Build.dll para leer el archivo edmx, generar los archivos ssdl, csdl y msl y luego incrustarlos en el dll de destino. (Estos archivos se pueden encontrar en C: \ Windows \ Microsoft.NET \ Framework \ v3.5).

Usando EdmGen

Como Craig señaló, es posible que pueda utilizar EdmGen.exe que se suministra con el marco. Lo intenté, pero hice un poco de personalización de los datos en mi archivo edmx y parece que EdmGen.exe realmente quiere hacer la generación inicial de la base de datos original.

Usando EdmGen2

EdmGen2.exe es un proyecto de código abierto que hace un poco más de EdmGen. Terminé usándolo para generar los archivos ssdl, csdl y msl. Puede apuntarlo a su archivo edmx y generará los archivos ssdl, csdl y msl necesarios. entonces yo incluido estas junto a mi DLL y modificar la cadena de conexión de

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

a

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

Nota que estoy diciendo la Entidad marco que estos archivos están en el mismo directorio que mi DLL, que no esté integrado como recursos.

Las tres de estas, la tarea de compilación, EdmGen y EdmGen2 son envolturas delgadas que llaman a System.Data.Entity.dll para todas las cosas difíciles. Como último recurso, puede echar un vistazo al dll de la tarea de construcción en el reflector y ver qué está haciendo.

Espero que esto ayude.

1

Sí, hay una utilidad de línea de comandos llamada EdmGen que puede hacer esto. Use EdmGen /? para posibles interruptores.

Cuestiones relacionadas