¿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 ModelBuilder
para ajustar el esquema.
También puedo crear un EDMX
diagrama y elegir un paso de generación de código que use plantillas T4 para generar las mismas POCO
clases.
En ambos casos termino con un POCO
objeto que es ORM
agnó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?
fuente
Respuestas:
Creo que las diferencias son:
Código primero
Base de datos primero
Modelo primero
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.fuente
DbContext
que existeObjectContext
simplemente se usa((IObjectContextAdapter)dbcontext).ObjectContext
.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:
Más información aquí .
fuente
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.
fuente
Citando las partes relevantes de http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework
fuente
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:
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:
fuente
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é.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente