Estoy tratando de decidir los pros y los contras de los 2 ORM principalmente en esta área.NHibernate vs. EF 4.1+
- compatibilidad con SQL Server 2008 R2 & 2012.
- Esto es muy importante ya que simplemente no tenemos los recursos para depurar el escaso apoyo de la tecnología de pila de MS existente.
- También está planificando el futuro, ya que 2012 está prácticamente listo y se planea migrar a él.
- Soporte para .NET 4.0 y 4.5 (próxima)
- Una vez más muy importante para casi la misma razón anterior.
- Gestión de transacciones y consejos de tabla, por ejemplo. las fuerzas pueden forzar la búsqueda, leer sin procesar.
- Muchas veces el optimizador de consultas hace bien su trabajo, otras veces deseo la flexibilidad para decirle qué hacer.
- Apoyo para la conversación, el seguimiento de auto adjuntar & desprender
- Esto es algo fundamental. Odio mantener la sesión abierta durante un período prolongado. Especialmente en entornos de computación distribuida/granja web.
- Capacidad para manejar el primer desarrollo del código, crear y actualizar el esquema sin destruir los datos.
- EF 4.1 parece ser deficiente en este sentido, aunque 4.3 es un salto y atado mejor. También me gustó la anotación de datos mejor que separar las clases de mapeo en NH. Me imagino que puedo enviar la clase y desde allí poder crear un modelo de persistencia sin ampliar el método para las clases de asignación.
- Soporte para el patrón IRepository
- Soporte para LINQ
- Algo atado a (6) anteriores Quiero realmente un buen soporte para LINQ. No quiero que los desarrolladores porquería alrededor con la implementación a nivel más bajo y conseguir nosotros mismos pegado a un particular ORM
- Rendimiento
- apoyo para las operaciones CRUD mayor, sin tener que cargar los datos en la capa de aplicación. P.ej. Quiero incrementar todas las filas de una columna de una tabla en particular por 1. No quiero cargar esto en la memoria e incrementar las filas una por una. Esto sería una locura para una operación tan simple. Linq2Sql solía tener Magiq para manejar este tipo de cosas, ¿qué NH y EF tienen?
- Almacenamiento en caché, carga ansiosa, carga lenta, propiedades de navegación.
- Déjame ser sincero Odio estas cosas cuando se hace implícitamente. La razón es que es difícil distinguir lo que se almacena en caché, añejo de lo nuevo. En EF, generalmente dejo todas las propiedades de navegación, porque no quiero que estas propiedades se carguen con las 5 principales, porque eso es lo que necesita la operación actual, pero más adelante en la secuencia, otro desarrollador intenta hacer un conteo que será inexacto.
- Así que mi política personal: todas las SOA serán apátridas a menos que exista una buena razón en caso contrario. Si necesita referenciar datos, obténgalo de la persistencia. Será más lento, pero el código será más legible y flexible.
- De forma similar para el almacenamiento en caché. Es bastante complejo ya que está en un entorno distribuido, quiero que todo el almacenamiento en caché sea muy explícito. Si un desarrollador desea codificar contra el caché, debería hacerlo, no codificar contra el ORM, y hacer que parezca que está extrayendo datos recientes de la persistencia cuando en realidad está obteniendo datos obsoletos.
- Ahora la pregunta es, ¿tiene NHibernate algún concepto/abstracción que haría que el almacenamiento en caché, la carga ansiosa/diferida sea mucho más explícita que la disponible actualmente en EF? En este caso, no me importa mucho la facilidad de desarrollo, me preocupo más por la claridad y la claridad.
Además no importa mucho para OSS vs argumento propietaria. El equipo no puede darse el lujo de echar un vistazo bajo el capó y comenzar a jugar con el código de otras personas. Me importa más el ángulo "simplemente funciona" que cualquier otra cosa.
pregunta Bien escrito, aunque Temo que es un poco abierto para SO; las preguntas aquí generalmente/a menudo tienen algún código fuente, y deben conducir a respuestas claras y prácticas. Tal vez es mejor para Programmers.SE? – Jeroen