La aplicación que estoy creando actualmente ha estado utilizando procedimientos almacenados y modelos de clase hechos a mano para representar objetos de la base de datos. Algunas personas han sugerido usar Entity Framework y estoy considerando cambiar a eso ya que no estoy tan avanzado en el proyecto. Mi problema es que siento que las personas que defienden EF solo me dicen el lado bueno de las cosas, no el lado malo :)
Mis principales preocupaciones son:
- Queremos la validación del lado del cliente utilizando anotaciones de datos, y parece que tengo que crear los modelos del lado del cliente de todos modos, así que no estoy seguro de que EF ahorre tanto tiempo de codificación
- Nos gustaría mantener las clases lo más pequeñas posible al pasar por la red, y he leído que usar EF a menudo incluye datos adicionales que no son necesarios
- Tenemos una capa de base de datos compleja que cruza múltiples bases de datos, y no estoy seguro de que EF pueda manejar esto. Tenemos una base de datos común con cosas como usuarios, códigos de estado, tipos, etc. y múltiples instancias de nuestras bases de datos principales para diferentes instancias de la aplicación. Las consultas SELECT pueden y consultarán en todas las instancias de las bases de datos, sin embargo, los usuarios solo pueden modificar los objetos que están en la base de datos en la que están trabajando actualmente. Pueden cambiar bases de datos sin volver a cargar la aplicación.
- Los modos de objeto son muy complejos y a menudo hay bastantes combinaciones involucradas
Los argumentos para EF son:
- Concurrencia. No tendría que codificar los controles para ver si el registro se actualizó antes de cada guardado
- Codigo de GENERACION. EF puede generar modelos de clase y POCO parciales para mí, sin embargo, no estoy seguro de que esto realmente me ahorre mucho tiempo, ya que creo que aún necesitaríamos crear modelos del lado del cliente para la validación y algunos métodos de análisis personalizados.
- Velocidad de desarrollo ya que no necesitaríamos crear los procedimientos almacenados CRUD para cada objeto de base de datos
Nuestra arquitectura actual consiste en un servicio WPF que maneja llamadas a la base de datos a través de procedimientos almacenados parametrizados, objetos POCO que van hacia / desde el servicio WCF y el cliente WPF, y el propio cliente de escritorio WPF que transforma los POCO en modelos de clase con el propósito de validación y El enlace de datos.
Entonces mi pregunta es, ¿es EF adecuado para esto? ¿Hay alguna trampa sobre EF que desconozco?
fuente
Respuestas:
Recientemente estaba evaluando Entity Framework y el mejor lugar que encontré para problemas y características faltantes fue: http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions
Los artículos con más votos:
Hay muchos más problemas en la lista de Voz del usuario.
En una nota al margen, estoy bastante entusiasmado con el próximo lanzamiento de EF 4.1 que incluirá el enfoque Code-First ... http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4 -1-release-candidato-available.aspx
Esto realmente puede empujarme a probar EF en una aplicación de producción.
fuente
.ToList()
o.ToArray
) antes de que sus expresiones LINQ estén completamente definidas. Es por eso que saca todos los registros y lo hace lento.Hacer una ramificación por error / función con EF puede ser notablemente doloroso en el momento de la fusión. Imagine que dos ramas A y B realizan cambios en la base de datos (lo que probablemente sucederá mucho durante las primeras etapas de un nuevo proyecto).
Combina todos los archivos "normales" - archivos cs, etc. Y luego es hora de fusionar Model.edmx. Y de repente no solo está fusionando las asignaciones lógicas entre su modelo de objeto y la base de datos, sino también las posiciones de las tablas en el diagrama de la entidad.
Combinar Model.edmx es tan doloroso que adoptamos una forma bastante desagradable que funciona:
fuente
Hay un par de otros beneficios para EF que te estás perdiendo:
Los inconvenientes (especialmente si está utilizando validación):
object
tipos, por lo que está ahí para leer los metadatos. Todavía hay mucho código extra inactivo.Esas son las dos mayores quejas que tengo. Hay una serie de beneficios, pero es muy posible que pueda obtener esos mismos beneficios de NHibernate. Si EntityFramework está sobre la mesa, haga que el equipo también revise NHibernate y haga una rápida revisión de los pros / contras de su proyecto.
El problema de la clase de metadatos es un dolor de cabeza, pero afortunadamente solo tengo tantas entidades que necesitan etiquetas de validación.
La falta de un verdadero modo separado para sus objetos limita lo que puede hacer en un entorno web. El modo adjunto es mejor para aplicaciones de escritorio, que es donde se han originado una serie de innovaciones de Microsoft. El modo separado es posible , pero muy doloroso. Es mejor usar una herramienta alternativa en este caso.
fuente
using(EFConnection conn = new EFConnection)
construcción. Si intentas esconder ese objeto en algún lugar para guardarlo de manera segura y puedas hacer una actualización rápida y guardarlo nuevamente en una segundausing(...)
declaración, tendrás que pensarlo nuevamente. Consulte msdn.microsoft.com/en-us/library/bb896271.aspx y msdn.microsoft.com/en-us/library/bb896248.aspx . Usar EF 3.5 (que tuve que usar en la última versión) ni siquiera es tan limpio.Una cosa en la que Microsoft no es muy bueno es en la compatibilidad de
comparabilidad conversiones anteriores, especialmente cuando se trata de nuevas tecnologías.Específicamente, EF1 (.net 3.5) es muy diferente de EF4 (.net 4.0); lo mismo podría ocurrir para la próxima versión.
Esperaría un rato y vería cómo madura la tecnología.
Mientras tanto, considere usar nHibernate: no es equivalente, pero es maduro y se usa de forma salvaje.
fuente
romper ...
Podría escribir una diatriba de 10 páginas. Pero, si solo está escribiendo una aplicación desechable para la Compañía X ... a quién le importa entonces. Pero, si estás desarrollando un producto de software ... vas a tener que ser mucho más anal
fuente
Mira esto: http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/
Los puntos principales son:
Tenga en cuenta que el enlace anterior está hablando de EF1.
También este enlace: http://ormeter.net/ muestra que EF no es el mejor en comparación con otros ORM en rendimiento y soporte LINQ.
fuente