entity-framework - modelo - entity framework vs procedimientos almacenados
Código primero vs Modelo/Base de datos primero (9)
¿Cuáles son las ventajas y desventajas de usar Entity Framework 4.1 Code-first sobre Model / Database-first con el diagrama EDMX?
Estoy tratando de entender completamente todos los enfoques para construir la capa de acceso a datos usando EF 4.1. Estoy usando patrón de repositorio y IoC
.
Sé que puedo usar el enfoque de código primero: defina mis entidades y contexto a mano y use ModelBuilder
para ajustar el esquema.
También puedo crear un diagrama EDMX
y elegir un paso de generación de código que use plantillas T4 para generar las mismas clases de POCO
.
En ambos casos, termino con un objeto POCO
que es ORM
agnóstico y contexto que deriva de DbContext
.
La primera 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 estos dos enfoques? ¿Es justo sobre la preferencia VS2010 vs Enterprise Manager?
Cotizando 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 crucero, 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 una pila gigante de código generado automáticamente. Implícate nunca tocar estos archivos generados para que no rompas algo, o tus cambios se sobrescriban en la próxima generación. El contexto y el inicializador están atascados juntos en este lío también. Cuando necesita agregar funcionalidad a sus modelos generados, como una propiedad de solo lectura calculada, necesita ampliar la clase de modelo. Esto termina siendo un requisito para casi todos los modelos y usted termina con una extensión para todo.
Con el código primero, los 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 desee agregar propiedades o cualquier otra cosa que la base de datos no necesite conocer. Puede simplemente agregarlos a la misma clase siempre y cuando siga la sintaxis correcta. Heck, incluso puede generar un archivo Model.edmx para visualizar su código si lo desea.
2) Mayor control
Cuando vaya primero a DB, estará a merced de lo que se genera para sus modelos para usar en su aplicación. Ocasionalmente, la convención de nombres no es deseable. A veces las relaciones y asociaciones no son exactamente lo que quieres. Otras veces, las relaciones no transitorias con la carga perezosa 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 podría encontrarse, el código de inicio le brinda un control completo y detallado desde el principio. Puede controlar cada aspecto de sus modelos de código y el diseño de su base de datos desde la comodidad de su objeto comercial. Puede especificar con precisión las 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 con entusiasmo o no se serializarán en absoluto. En resumen, eres responsable de más cosas, pero tienes el control total del diseño de tu aplicación.
3) Control de versiones de la base de datos
Este es un grande. Versionar bases de datos es difícil, pero con el código primero y el código las primeras migraciones, es mucho más efectivo. Debido a que el esquema de su base de datos está completamente basado en sus modelos de código, al controlar la versión del código fuente, está ayudando a la versión de su base de datos. Usted es responsable de controlar la inicialización de contexto, lo que puede ayudarlo a hacer cosas como datos de negocio fijos. También eres responsable de crear las primeras migraciones de código.
Cuando se habilitan las migraciones por primera vez, se generan una clase de configuración y una migración inicial. La migración inicial es su esquema actual o su línea de base v1.0. A partir de ese momento, agregará migraciones con marcas de tiempo y etiquetas con un descriptor para ayudar con el pedido de las 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 ARRIBA () y ABAJO (). La función ARRIBA aplica los cambios a la base de datos, la función ABAJO elimina los mismos cambios en el evento que desea 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 el esquema de su base de datos.
Creo que este simple "árbol de decisiones" de Julie Lerman, el autor de "Programming Entity Framework" debería ayudar a tomar la decisión con más confianza:
Más información Here .
Creo que las diferencias son:
Codificar primero
- Muy popular porque a los programadores expertos no les gustan ningún tipo de diseñadores y definir mapas en EDMX xml es demasiado complejo.
- Control total sobre el código (no se genera código que sea difícil de modificar).
- La expectativa general es que no te molestes con DB. DB es solo un almacenamiento sin lógica. EF manejará la creación y no querrás saber cómo hace el trabajo.
- Lo más probable es que los cambios manuales en la base de datos se pierdan porque su código define la base de datos.
Base de datos primero
- Muy popular si tiene una base de datos diseñada por DBA, desarrollada por separado o si tiene una base de datos existente.
- Permitirá que EF cree entidades para usted y, después de la modificación de la asignación, generará entidades POCO.
- Si desea funciones adicionales en las entidades de POCO, debe modificar la plantilla de T4 o usar clases parciales.
- Los cambios manuales en la base de datos son posibles porque la base de datos define el modelo de su dominio. Siempre puede actualizar el modelo desde la base de datos (esta característica funciona bastante bien).
- A menudo uso esto en proyectos de VS Database (solo en las versiones Premium y Ultimate).
Modelo primero
- En mi humilde opinión es popular si eres un fanático del diseño (= no te gusta escribir código o SQL).
- Usted "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 de sus entidades como de la base de datos, pero para proyectos pequeños y sencillos será muy productivo.
- Si desea funciones adicionales en las entidades de POCO, debe modificar la plantilla de T4 o usar 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 el 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 los proyectos de la base de datos en VS.
Espero que en el caso de EF 4.1 haya otras características relacionadas con Code First vs. Model / Database primero. La API fluida utilizada en el Código primero no ofrece todas las características de EDMX. Espero que funciones como la asignación de procedimientos almacenados, las vistas de consulta, la definición de vistas, etc. funcionen cuando se usa primero el Modelo / Base de datos y DbContext
(aún no lo he probado) pero no en el Código primero.
Ejemplo de primer acercamiento a la base de datos:
Sin escribir ningún código: ASP.NET MVC / MVC3 Database First Approach / Database first
Y creo que es mejor que otros enfoques porque la pérdida de datos es menor con este enfoque.
El código primero 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 base de datos.
Si está creando una aplicación MVC3, creo que el código primero tiene las siguientes ventajas:
- Fácil decoración de atributos : puede decorar campos con atributos de validación, requerimiento, etc., es bastante incómodo con el modelado de EF
- No hay errores de modelado raros: 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 fusionar : cuando se utilizan herramientas de control de versión de código como mercurial, fusionar archivos .edmx es una molestia. Eres un programador acostumbrado a C #, y ahí estás fusionando un .edmx. No es así con el código primero.
- Contraste primero con el Código y tendrá un control completo sin todas las complejidades ocultas y las 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 andamio.
- Migraciones de base de datos - También puede habilitar migraciones. Esto es tan poderoso. Realiza cambios a su modelo en el código, y luego el marco puede realizar un seguimiento de los cambios de esquema, por lo que puede implementar actualizaciones sin problemas, con las versiones de esquema actualizadas automáticamente (y, si es necesario, actualizadas). (No estoy seguro, pero esto probablemente también funcione con el modelo primero)
Actualizar
La pregunta también solicita una comparación de code-first con EDMX model / db-first. El código primero se puede usar para estos dos enfoques también:
- Modelo Primero : Codificar primero los POCO (el modelo conceptual) y luego generar la base de datos (migraciones); O
- Base de datos primero : dada una base de datos existente, codifique manualmente los POCO para que coincidan. (La diferencia aquí es que los POCO no se generan automáticamente para la base de datos existente). Puede acercarse a lo automático, sin embargo, utilizando Generar clases de POCO y la asignación de una base de datos existente utilizando Entity Framework o Entity Framework 5 - Cómo generar clases de POCO desde la base de datos existente .
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 empresas grandes con DBA controlando las bases de datos, no obtiene la flexibilidad de crear aplicaciones sin utilizar los primeros enfoques de base de datos. He trabajado en muchos proyectos y, en lo que respecta a la implementación, querían un control total.
Por lo que estoy 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 DBAs que ejecutan el programa, entonces podría considerar la primera opción de la Base de Datos solo como mi opinión.
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 utilizando el diseñador, que puede alterar la base de datos utilizando un script sql y actualizar su modelo.
Cuando utiliza el código por primera vez, no puede modificar 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 usar código primero en producción. Por ahora no es realmente utilizable.
La segunda desventaja menor del código primero es que el creador de modelos requiere privilegios en la base de datos maestra. Esto no le afecta si utiliza la base de datos de 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 enfoque de código primero al crear una aplicación independiente simple sin versiones y usar el modelo / base de datos primero en proyectos que requieran modificación en la producción.
Primero utilizo la base de datos de EF para proporcionar más flexibilidad y control sobre la configuración de la base de datos.
Al principio, el código y el modelo de EF parecían ser geniales al principio, y proporciona independencia de la base de datos; sin embargo, al hacer esto 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 tablas, 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 base de datos directamente de todos modos.
Me parece que las clases de POCO predeterminadas generadas durante el DB primero están muy limpias, sin embargo, carecen de los atributos de anotación de datos muy útiles, o asignaciones a procedimientos almacenados. Utilicé las plantillas T4 para superar algunas de estas limitaciones. Las plantillas T4 son increíbles, especialmente cuando se combinan con sus propios metadatos y clases parciales.
El primer modelo parece tener mucho potencial, pero me está dando muchos errores durante la refactorización compleja del esquema de base de datos. No estoy seguro de por qué.
Trabajar con modelos grandes era muy lento antes del SP1, (no lo he probado después del SP1, pero se dice que es muy fácil ahora).
Sigo diseñando primero mis tablas, luego una herramienta interna desarrollada para mí genera los POCO, por lo que me cuesta realizar tareas repetitivas para cada objeto de poco.
cuando está utilizando sistemas de control de código 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, 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 externas y mi vista POCO se deriva de mis clases de POCO, lo cual es muy útil nuevamente.
Y finalmente no me gustan los diseñadores.