entity-framework - initial - consider using code first migrations to update the database
Entity Framework Merge Nightmare (5)
Como dijiste, una opción es bloquear el archivo.
Otra opción posible es encaminar todos los cambios de modelo a través de un individuo en el equipo.
Otra opción es dividir el archivo en archivos más pequeños (como uno por clase), posiblemente dejando algo de soporte de diseñador en el proceso.
Otra opción es crear su propio proceso, potencialmente utilizando XSLT para transformar el archivo EDMX, pero no estoy seguro de cómo se vería exactamente, el archivo designer.cs es muy difícil de fusionar.
Otra opción es considerar un ORM diferente.
No estoy seguro de si están haciendo algo para mejorar esto en la próxima versión de EF. Lanzar tantos datos en un solo archivo no implica escalabilidad de ningún tipo (Sin embargo, LinqToSql hace lo mismo: en ese caso, Damien Guard creó algunas plantillas T4 para separar el archivo, no estoy seguro de si existe algo similar para EF).
Hemos adoptado el Entity Framework y estamos descubriendo que cuando varias personas realizan cambios aislados en sus ramas de control de origen individuales, hay conflictos masivos cuando se unen en una combinación, lo que resulta en archivos de modelo rotos.
Nos inclinamos en la dirección de forzar retiros exclusivos en el archivo, pero me gustaría evitar eso.
Mi pregunta es...
¿Existe una mejor herramienta de comparación que maneje esto mejor o hay otro enfoque que podríamos adoptar?
Buscando algo que se demuestre si es posible.
NUEVA ACTUALIZACIÓN: Para aquellos de ustedes que se encuentran con esta pregunta, se basa en el antiguo EF. Sugiero pasar a usar DbContext sobre EDMX. Hay mucha información aquí sobre SO. La simplicidad de la base de datos primero o del código primero supera con creces la pérdida del diseñador en mi opinión.
ACTUALIZACIÓN: Resolvimos este problema forzando cambios exclusivos en el archivo. Al agregar este proceso eliminamos completamente cualquier problema. Si bien esta no era la solución ideal, era la más confiable y fácil de implementar.
En realidad, traté de convencer a mi empresa de que fuera a Code First por este motivo y, por desgracia, cerré. Les gusta poder usar el diseñador. Desafortunadamente, tuve problemas en nuestro último despliegue de producción donde uno de nuestros servicios WCF tiene aproximadamente 10 puntos finales para admitir a múltiples consumidores, y en el proceso de fusión, hubo varias entradas duplicadas en la sección CS del archivo EDMX .
En mis proyectos personales, estoy usando Code First exclusivamente. Para mí, es la misma razón por la que prefiero la transmisión manual a la automática. Claro, el diseñador de modelos puede ser más fácil (a veces, como hemos discutido), pero con Code First, obtienes un control mucho más directo de lo que está sucediendo. Al igual que una transmisión manual. :)
Hay algunas estrategias para tratar con modelos de Entity Framework grandes en este artículo . Podrías considerar usarlos. Sin embargo, he encontrado que la mayor parte del dolor con la regeneración del EDMX proviene de los cambios realizados al arrastrar y soltar en el diseñador de GUI. Por otro lado, la actualización del Modelo desde la base de datos o a través de la ventana de propiedades tiende a hacer cambios de una manera bastante sensata, y no suele ser difícil fusionar.
El mayor problema, por lo que puedo ver, es que la información de diseño para el modelo de objeto visual en los modelos conceptual / de mapeo / almacenamiento está en el mismo archivo. En otras palabras, el problema no es tanto el tamaño del archivo en sí mismo o los cambios realizados en el modelo de entidad en sí, sino la reorganización general que se produce cuando arrastra y suelta un objeto en el diseñador de GUI. Me gustaría que el diseño del diseñador GUI y los modelos conceptuales / de mapeo / almacenamiento estuvieran en diferentes archivos. Creo que esto eliminaría la mayor parte del dolor con la fusión de cambios en el modelo.
Por lo tanto, tenemos una política semioficial de no realizar cambios en el diseño gráfico del modelo. Esto no es una gran pérdida, porque cuando tienes más de un par de docenas de entidades en tu modelo, el diseñador de GUI de una sola página no es realmente útil de todos modos. Y ciertamente hace que las fusiones sean mucho más fáciles.
La versión 4 de Entity Framework tendrá una opción para generar artefactos basados en plantillas T4. No soy un experto, pero puede ser posible convencer a la información de diseño de GUI en un archivo diferente usando una plantilla T4.
No estoy muy familiarizado con EF en particular, pero he tenido mi parte justa de problemas con código autogenerado ultra verboso y frágil. En cada caso, la mejor respuesta sobre cómo fusionarlo fue "no hacerlo". En su escenario, eso probablemente significa una de dos cosas:
1) Ajuste su modelo de promoción de código para que el código EF solo fluya en una dirección. En otras palabras, todos los conflictos se resolverán como "copiar desde la rama fuente" (Aceptar Aceptar) o "mantener el objetivo sin cambios" (Aceptar Sus), y todos deberían saber cuál es cuál de ellos por adelantado. Más comúnmente, querrá aceptar las sugerencias cuando promueva código recién probado hacia los nodos estables del árbol de la rama y Aceptar sus tuyos cuando fusione las correcciones de nuevo con las ramas inestables / de desarrollo. (Si hay> 1 rama de desarrollo, querrá dividir las cosas de modo que solo el código EF que es propiedad del equipo que trabaja en una rama determinada siga la última regla. Todo lo que no estén modificando intencionalmente debe ser sobrescrito por el código de otros equipos que fluye desde la rama de integración, utilizando AcceptTheirs si es necesario.)
/- [...]
/- v1.1
/- Release
+ Integration
- Dev1
- Dev2
- [...]
" Combinar, copiar "
2) Literalmente no los fusiones; excluir el código EF del proceso por completo. Cuando la integración de sucursales requiere cambios en la base de datos y / o ORM, regenere las clases de proxy directamente desde la base de datos. (después de resolver + construir cualquier cambio conflictivo en sus archivos SQL, por supuesto) Versión Extrema: haga esto durante cada compilación automatizada, no solo cuando se fusiona.
Craig Stuntz hace un buen trabajo explicando que es el xml relacionado con el diseñador (las posiciones de entidades y asociaciones, etc. en la superficie de diseño) lo que causa la mayoría de los problemas aquí. La resolución de conflictos dentro del elemento edmx:Runtime
, sin embargo, es muy factible.
La mejor estrategia para tratar los conflictos en el xml relacionado con el diseñador es omitirlos por completo sacrificando cualquier diseño personalizado y volviendo a un diseño predeterminado.
El truco es eliminar todo el contenido del elemento <Diagrams>
. El diseñador abrirá sin ningún problema y aplicará un diseño predeterminado.
El siguiente es un ejemplo de un archivo EDMX que se abrirá con un diseño predeterminado. Tenga en cuenta que el contenido del elemento <edmx:Runtime>
también se eliminó, sin embargo, esto fue solo por razones de brevedad, no es parte de la solución.
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
<!-- EF Runtime content -->
<edmx:Runtime>
<!-- Removed for brevity''s sake only!-->
</edmx:Runtime>
<!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
<Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
<Connection>
<DesignerInfoPropertySet>
<DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
</DesignerInfoPropertySet>
</Connection>
<Options>
<DesignerInfoPropertySet>
<DesignerProperty Name="ValidateOnBuild" Value="true" />
<DesignerProperty Name="EnablePluralization" Value="True" />
<DesignerProperty Name="IncludeForeignKeysInModel" Value="True" />
</DesignerInfoPropertySet>
</Options>
<!-- Diagram content (shape and connector positions) -->
<Diagrams>
</Diagrams>
</Designer>
</edmx:Edmx>
Tenga en cuenta que el diseño predeterminado que se aplica aquí no coincide con el que se obtiene al seleccionar Diagram | Layout Diagram
Diagram | Layout Diagram
de diseño del menú contextual del diseñador, que es lo que habría esperado.
Actualización: a partir de Entity Framework 5 , esto se vuelve un poco más fácil. El soporte para múltiples diagramas que se agrega allí descarga el diagrama relacionado con XML para separar archivos. Tenga en cuenta que todavía tenía algunas etiquetas antiguas relacionadas con diagramas en un archivo edmx que había experimentado varias actualizaciones de Entity Framework. Simplemente eliminé la etiqueta llamada Diagramas (incluidos los niños) del archivo edmx.