Código primero vs Modelo / Base de datos primero [cerrado]

618

¿Cuáles son las ventajas y desventajas de usar Entity Framework 4.1 primero en código sobre modelo / base de datos primero con diagrama EDMX?

Estoy tratando de comprender completamente todos los enfoques para construir la capa de acceso a datos usando EF 4.1. Estoy usando el patrón de repositorio y IoC.

Sé que puedo usar el enfoque de código primero: definir mis entidades y contexto a mano y usar ModelBuilderpara ajustar el esquema.

También puedo crear un EDMXdiagrama y elegir un paso de generación de código que use plantillas T4 para generar las mismas POCOclases.

En ambos casos termino con un POCOobjeto que es ORMagnóstico y el contexto del que deriva DbContext.

Primero, la base de datos parece ser la más atractiva, ya que puedo diseñar una base de datos en Enterprise Manager, sincronizar rápidamente el modelo y ajustarlo con el diseñador.

Entonces, ¿cuál es la diferencia entre esos dos enfoques? ¿Se trata solo de la preferencia VS2010 vs Enterprise Manager?

Jakub Konecki
fuente
12
Entity Framework 7 está eliminando EDMX: msdn.microsoft.com/en-us/magazine/dn890367.aspx
CAD bloke
55
@CADbloke Entity Framework 7 ahora es Entity Framework Core 1.0
RBT
66
Para cualquier otro navegador, a menos que tenga un hardon para 7000 archivos XML largos y resuelva conflictos de fusión en lo mencionado anteriormente, vaya primero al código y ahórrese un dolor de cabeza
Dan Pantry
3
Hay un buen informe de
danio
44
Casi todas las respuestas son "Creo" ... la definición absoluta de "Principalmente basado en la opinión".
Lankymart

Respuestas:

703

Creo que las diferencias son:

Código primero

  • Muy popular porque a los programadores hardcore no les gusta ningún tipo de diseñadores y la definición de mapeo en EDMX xml es demasiado compleja.
  • Control total sobre el código (sin código autogenerado que es difícil de modificar).
  • La expectativa general es que no te molestes con DB. DB es solo un almacenamiento sin lógica. EF se encargará de la creación y no querrás saber cómo funciona.
  • Los cambios manuales en la base de datos probablemente se perderán porque su código define la base de datos.

Base de datos primero

  • Muy popular si tiene un DB diseñado por DBA, desarrollado por separado o si tiene un DB existente.
  • Dejará que EF cree entidades para usted y, después de modificar la asignación, generará entidades POCO.
  • Si desea funciones adicionales en entidades POCO, debe modificar la plantilla T4 o utilizar clases parciales.
  • Los cambios manuales en la base de datos son posibles porque la base de datos define su modelo de dominio. Siempre puede actualizar el modelo desde la base de datos (esta característica funciona bastante bien).
  • A menudo uso esto juntos proyectos de base de datos VS (solo versión Premium y Ultimate).

Modelo primero

  • En mi humilde opinión, si eres fanático del diseño (= no te gusta escribir código o SQL).
  • "Dibujará" su modelo y permitirá que el flujo de trabajo genere su script de base de datos y la plantilla T4 genere sus entidades POCO. Perderá parte del control tanto en sus entidades como en la base de datos, pero para proyectos pequeños y fáciles será muy productivo.
  • Si desea funciones adicionales en entidades POCO, debe modificar la plantilla T4 o utilizar clases parciales.
  • Los cambios manuales en la base de datos probablemente se perderán porque su modelo define la base de datos. Esto funciona mejor si tiene instalado un paquete de energía de generación de base de datos. Le permitirá actualizar el esquema de la base de datos (en lugar de recrear) o actualizar proyectos de bases de datos en VS.

Espero que en el caso de EF 4.1 haya varias otras características relacionadas con Code First vs. Model / Database primero. La API fluida utilizada en Code primero no ofrece todas las características de EDMX. Espero que las características como el mapeo de procedimientos almacenados, las vistas de consulta, las vistas de definición, etc. funcionen cuando se usa primero el Modelo / Base de datos y DbContext(aún no lo he probado) pero no lo hacen primero en el Código.

Ladislav Mrnka
fuente
55
@Ladislav: gracias por la respuesta integral. Solo para aclarar: a excepción de algunas limitaciones de la API fluida, ¿no hay diferencias técnicas reales entre esos enfoques? ¿Se trata más de desarrollo / proceso de implementación / metodología? Por ejemplo, tengo entornos separados para Dev / Test / Beta / Prod y actualizaré la base de datos manualmente en Beta / Prod ya que los cambios en el esquema pueden requerir algunas modificaciones de datos complejas. Con Dev / Test, estoy feliz de que EF elimine y cree bases de datos, ya que las sembraré con datos de prueba en los inicializadores.
Jakub Konecki
152
He estado diseñando bases de datos durante tanto tiempo que parece que no puedo imaginar hacer nada más que una base de datos primero. De hecho, todavía escribo muchos procedimientos almacenados para las declaraciones de selección de mayor volumen y tal, y luego haré una importación de funciones en el modelo EF todo en nombre del rendimiento.
Steve Wortham
99
¿Qué quiere decir con declaraciones de alto volumen select? Los procedimientos almacenados no son más rápidos que los SELECT enviados desde la aplicación.
Piotr Perak el
20
Usted puede tener SQL en su aplicación. Es muy probable que SQL esté incrustado en el código compilado, y cualquier cambio requerirá una recompilación y una nueva implementación, mientras que un cambio de Procedimiento almacenado solo requerirá la edición del Procedimiento almacenado. Los clientes / clientes / usuarios se verán menos afectados por los cambios en este caso.
CodeWarrior
55
@JakubKonecki, todo lo que no encuentre en el DbContextque existe ObjectContextsimplemente se usa ((IObjectContextAdapter)dbcontext).ObjectContext.
Shimmy Weitzhandler
134

Creo que este simple "árbol de decisiones" de Julie Lerman, autora de "Programming Entity Framework", debería ayudar a tomar la decisión con más confianza:

Un árbol de decisiones para ayudar a elegir diferentes enfoques con EF

Más información aquí .

Bahador Izadpanah
fuente
111
Esto no está completo. ¿Qué sucede si prefiere NO usar un diseñador visual pero TIENE una base de datos existente?
Dave New
14
Peor aún ... las decisiones de la vida real no se toman mediante diagramas sino más bien por limitaciones técnicas a las que se enfrenta al usar el código primero, por ejemplo, no puede crear un índice único en un campo o no puede eliminar datos jerárquicos en una tabla de árbol para esto. necesita un CTE usando context.Table.SqlQuery ("select ..."). El modelo / base de datos primero no tiene estos inconvenientes.
Elisabeth
32
@davenewza ese es el primer camino, ¿no?
Chris S
3
@davenewza existente database => clases existentes? Primero el código: Primero la base de datos :)
riadh gomri
44
@davenewza Use Entity framework Powertools para crear sus clases de POCO desde DB. Codifique primero para una base de datos existente
Iman Mahmoudinasab
50

La base de datos primero y el modelo primero no tienen diferencias reales. El código generado es el mismo y puede combinar estos enfoques. Por ejemplo, puede crear una base de datos usando el diseñador, que puede alterar la base de datos usando el script sql y actualizar su modelo.

Cuando usa el código primero, no puede alterar el modelo sin la base de datos de recreación y perder todos los datos. En mi humilde opinión, esta limitación es muy estricta y no permite utilizar el código primero en producción. Por ahora no es realmente utilizable.

La segunda desventaja menor del código primero es que el generador de modelos requiere privilegios en la base de datos maestra. Esto no le afecta si usa la base de datos SQL Server Compact o si controla el servidor de la base de datos.

La ventaja del código primero es un código muy limpio y simple. Usted tiene el control total de este código y puede modificarlo y usarlo fácilmente como su modelo de vista.

Puedo recomendar usar el primer enfoque de código cuando cree una aplicación independiente simple sin versionar y usar model \ database primero en proyectos que requieran modificación en producción.

Stepan Smagin
fuente
77
Si va a actualizar manualmente el entorno de producción con scripts SQL, puede hacer lo mismo con Code First. Simplemente genera los scripts de cambio según sea necesario. Varias herramientas pueden automatizar estos deltas, y puede seguir usando Code First. Simplemente necesitará cambiar el inicializador de Code First a algo así como CreateDatabaseIfNotExists para no eliminar la base de datos actual.
Esteban Brenes
Algunas diferencias son importar vistas y luego regenerar la base de datos donde las vistas se convierten en tablas. Hace que sea difícil generar una nueva base de datos y compararla con la base de datos prod para ver si está sincronizada.
Dave
Model First no admite funciones SQL definidas por el usuario (al menos en EF4, no sé si esto ha cambiado). Con Database First, puede importar UDF y usarlos en sus consultas LINQ.
Tsahi Asher
No hay diferencias? Intente importar vistas y tablas de SimpleMembership y luego generar una base de datos a partir del modelo y ver qué obtiene. ¡Ni siquiera cerca! Estos deberían ser de ida y vuelta, pero MSFT básicamente ha abandonado MF y DF en lugar de CF, que también está incompleto en términos de uso de vistas y procesos almacenados.
Dave
Puede deshabilitar el proceso de recreación de la base de datos basada en las primeras migraciones de código y hacerlo manualmente en el modelo y la base de datos. puede hacerlo especificando disableDatabaseInitialization = "true" en su web / app.config en <EntityFramework> ..... <contexts> <context type = "myNamespace.mydbContext", "myassemblyORProject" disableDatabaseInitialization = "true" /> </EntityFramework> Puede eliminar la carpeta de migraciones.
Hasteq
37

Citando las partes relevantes de http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework

3 razones para usar el primer diseño de código con Entity Framework

1) Menos cruft, menos hinchazón

El uso de una base de datos existente para generar un archivo de modelo .edmx y los modelos de código asociados da como resultado un montón gigante de código generado automáticamente. Le imploramos que nunca toque estos archivos generados para que no rompa algo o sus cambios se sobrescriban en la próxima generación. El contexto y el inicializador también están atascados en este desastre. Cuando necesita agregar funcionalidad a sus modelos generados, como una propiedad calculada de solo lectura, necesita extender la clase de modelo. Esto termina siendo un requisito para casi todos los modelos y terminas con una extensión para todo.

Con el código primero, sus modelos codificados a mano se convierten en su base de datos. Los archivos exactos que está creando son los que generan el diseño de la base de datos. No hay archivos adicionales y no es necesario crear una extensión de clase cuando desea agregar propiedades o cualquier otra cosa que la base de datos no necesite saber. Puede agregarlos a la misma clase siempre que siga la sintaxis adecuada. Diablos, incluso puede generar un archivo Model.edmx para visualizar su código si lo desea.

2) mayor control

Cuando va a DB primero, está a merced de lo que se genera para que sus modelos se usen en su aplicación. Ocasionalmente, la convención de nomenclatura es indeseable. A veces las relaciones y asociaciones no son exactamente lo que quieres. Otras veces, las relaciones no transitorias con carga lenta causan estragos en sus respuestas API.

Si bien casi siempre hay una solución para los problemas de generación de modelos con los que puede encontrarse, el código inicial primero le brinda un control completo y detallado desde el principio. Puede controlar cada aspecto de sus modelos de código y su diseño de base de datos desde la comodidad de su objeto comercial. Puede especificar con precisión relaciones, restricciones y asociaciones. Puede establecer simultáneamente límites de caracteres de propiedad y tamaños de columna de base de datos. Puede especificar qué colecciones relacionadas se cargarán ansiosamente o no se serializarán en absoluto. En resumen, usted es responsable de más cosas, pero tiene el control total del diseño de su aplicación.

3) Control de versión de la base de datos

Este es un grande. El control de versiones de las bases de datos es difícil, pero con las migraciones de código primero y código primero, es mucho más efectivo. Debido a que el esquema de su base de datos se basa completamente en sus modelos de código, al controlar la versión de su código fuente, está ayudando a versionar su base de datos. Usted es responsable de controlar su inicialización de contexto que puede ayudarlo a hacer cosas como la semilla de datos comerciales fijos. También es responsable de crear las primeras migraciones de código.

Cuando habilita las migraciones por primera vez, se genera una clase de configuración y una migración inicial. La migración inicial es su esquema actual o su línea base v1.0. A partir de ese momento, agregará migraciones que están marcadas con el tiempo y etiquetadas con un descriptor para ayudar con el pedido de versiones. Cuando llame a add-Migration desde el administrador de paquetes, se generará un nuevo archivo de migración que contiene todo lo que ha cambiado en su modelo de código automáticamente en las funciones UP () y DOWN (). La función ARRIBA aplica los cambios a la base de datos, la función ABAJO elimina esos mismos cambios en el caso de que desee revertir. Además, puede editar estos archivos de migración para agregar cambios adicionales, como nuevas vistas, índices, procedimientos almacenados y cualquier otra cosa. Se convertirán en un verdadero sistema de versiones para su esquema de base de datos.

Dijo Roohullah Allem
fuente
31

Code-first parece ser la estrella en ascenso. Eché un vistazo rápido a Ruby on Rails, y su estándar es el código primero, con migraciones de bases de datos.

Si está creando una aplicación MVC3, creo que Code primero tiene las siguientes ventajas:

  • Fácil decoración de atributos : puede decorar campos con validación, requerir, etc. atributos, es bastante incómodo con el modelado EF
  • Sin errores de modelado extraños: el modelado de EF a menudo tiene errores extraños, como cuando intenta cambiar el nombre de una propiedad de asociación, debe coincidir con los metadatos subyacentes, muy inflexible.
  • No es incómodo fusionarse : cuando se utilizan herramientas de control de versiones de código como mercurial, fusionar archivos .edmx es una tarea difícil. Eres un programador acostumbrado a C #, y allí estás fusionando un .edmx. No es así con el código primero.
  • Contraste primero con Code y tendrá el control completo sin todas las complejidades ocultas e incógnitas con las que lidiar.
  • Le recomiendo que use la herramienta de línea de comandos del Administrador de paquetes, ni siquiera use las herramientas gráficas para agregar un nuevo controlador a las vistas de andamios.
  • DB-Migraciones : entonces también puede habilitar las migraciones. Esto es muy poderoso. Realiza cambios en su modelo en el código, y luego el marco puede realizar un seguimiento de los cambios en el esquema, por lo que puede implementar actualizaciones sin problemas, con versiones de esquema actualizadas automáticamente (y degradadas si es necesario). (No estoy seguro, pero esto probablemente también funcione con el modelo primero)

Actualizar

La pregunta también pide una comparación de code-first con EDMX model / db-first. Code-first se puede usar para ambos enfoques también:

Todd
fuente
3
Model-first no codifica POCO primero, esto es Code First, Model-First es un diseñador visual para generar POCOs automáticamente y luego generar bases de datos desde el modelo.
Diego Mendes
En estos días, tanto en las rutas visuales como de código, puede hacer primero "Modelo" o "Base de datos" primero. El primero es el diseño manual (ya sea a través de código o editor visual), el segundo es construir una base de datos y crear el modelo (POCO o EDMX).
Todd
11

Primero uso la base de datos EF para proporcionar más flexibilidad y control sobre la configuración de la base de datos.

El código EF primero y el modelo primero parecían geniales al principio, y proporciona independencia de la base de datos, sin embargo, al hacerlo, no le permite especificar lo que considero información de configuración de base de datos muy básica y común. Por ejemplo, los índices de tabla, los metadatos de seguridad o una clave principal que contiene más de una columna. Creo que quiero usar estas y otras características comunes de la base de datos y, por lo tanto, tengo que hacer alguna configuración de la base de datos directamente de todos modos.

Creo que las clases POCO predeterminadas generadas durante la DB primero son muy limpias, sin embargo, carecen de los atributos de anotación de datos muy útiles o las asignaciones a los procedimientos almacenados. Utilicé las plantillas T4 para superar algunas de estas limitaciones. Las plantillas T4 son impresionantes, especialmente cuando se combinan con sus propios metadatos y clases parciales.

El modelo primero parece tener mucho potencial, pero me está dando muchos errores durante la refactorización de esquemas de bases de datos complejas. No estoy seguro de por qué.

usuario1618371
fuente
44
Usted puede definir claves compuestas utilizando CODIGO - stackoverflow.com/questions/5466374/...
Jakub Konecki
3
Para futuros lectores, este ya no es el caso, puede agregar índices, claves primarias de varias columnas y este tipo de cosas en EF Code First.
tobiak777
1
EF debería haberse solucionado para que los 3 enfoques se pudieran usar indistintamente en la misma base de datos, ya que existen ventajas y desventajas para los 3 enfoques
Dave,
Además, la verdad de que no es la primera solución de código ideal, estoy usando la base de datos primero debido a la migración a otro IDE / Lenguaje en el futuro y quiero tener una estructura de base de datos sólida e integrada, otro hecho que prefiero primero es que la base de datos sea flexible para cambiar cualquier parte de almacenamiento de datos.
QMaster
7

Trabajar con modelos grandes era muy lento antes del SP1 (no lo he probado después del SP1, pero se dice que ahora es muy fácil).

Sigo diseñando mis tablas primero, luego una herramienta interna genera los POCO para mí, por lo que toma la carga de hacer tareas repetitivas para cada objeto poco.

cuando usa sistemas de control de fuente, puede seguir fácilmente el historial de sus POCO, no es tan fácil con el código generado por el diseñador.

Tengo una base para mi POCO, lo que hace que muchas cosas sean bastante fáciles.

Tengo vistas para todas mis tablas, cada vista base trae información básica para mis claves foráneas y mis POCO de vista derivan de mis clases de POCO, lo cual es bastante útil nuevamente.

Y finalmente no me gustan los diseñadores.

hazimdikenli
fuente
8
"cuando utiliza sistemas de control de fuente, puede seguir fácilmente el historial de sus POCO, no es tan fácil con el código generado por el diseñador". - Mantengo el código generado por el diseñador en Source Control, para que siempre pueda ver el historial.
Jakub Konecki
1
@JakubKonecki ¿Alguna vez trató de fusionar archivos EDMX en un equipo de más de 3 personas? Es solo un dolor ... En cambio, las personas intentan evitar la fusión y simplemente toman la otra revisión y repiten sus propios cambios, porque la fusión es propensa a fallar en un archivo generado automáticamente con miles de líneas de XML.
bytecode77
6

Primer ejemplo de enfoque de base de datos:

Sin escribir ningún código: ASP.NET MVC / MVC3 Base de datos Primer enfoque / Base de datos primero

Y creo que es mejor que otros enfoques porque la pérdida de datos es menor con este enfoque.

AukI
fuente
¿Podría explicar si hay 'menos pérdida de datos' con el primer enfoque de DB? ¿Cómo realizaría la transformación de datos si dividiera la tabla existente en dos?
Jakub Konecki
probablemente terminaría escribiendo un script sql que se ocupa de la transformación. En general, MS anunció mejorar la migración de datos de Code First con su nueva versión, por lo que esto podría no ser un argumento en el futuro.
ckonig
El problema con la base de datos primero es que el diseño de la base de datos generalmente tiene abstracciones defectuosas que se filtran en su modelo ... tablas de unión, etc. El trabajo de la base de datos es simplemente persistir en su modelo.
Nerdfest
Esta "respuesta" es una opinión basada en su argumento, una oración no tiene una postura.
TravisO
¿Podría explicar si hay 'menos pérdida de datos' con el primer enfoque de DB?
amal50
4

En mi humilde opinión, creo que todos los modelos tienen un gran lugar, pero el problema que tengo con el primer enfoque del modelo es que en muchas grandes empresas con DBA controlando las bases de datos, no obtienes la flexibilidad de crear aplicaciones sin usar los primeros enfoques de la base de datos. He trabajado en muchos proyectos y cuando se trataba de la implementación querían un control total.

Por lo tanto, por mucho que esté de acuerdo con todas las variaciones posibles Código Primero, Modelo Primero, Base de Datos primero, debe considerar el entorno de producción real. Entonces, si su sistema va a ser una gran aplicación de base de usuarios con muchos usuarios y DBA que ejecutan el programa, entonces podría considerar la primera opción de la Base de datos como mi opinión.

Matthew Parton
fuente
Tienes razón. MS dio a los programadores diferentes enfoques porque los escenarios son diferentes. Debe saberlo todo y decidir, según su escenario, qué es lo mejor para el proyecto y qué es lo que más le gusta.
Sterling Diaz
0

Creo que una de las ventajas del código primero es que puede hacer una copia de seguridad de todos los cambios que ha realizado en un sistema de control de versiones como Git. Debido a que todas sus tablas y relaciones se almacenan en lo que son esencialmente solo clases, puede retroceder en el tiempo y ver cuál era la estructura de su base de datos.

anónimo_dojo
fuente