.net - descargar - nhibernate vs entity framework
Subsónico vs NHibernate (15)
¿Cuál es el consenso sobre cuándo usar una de estas herramientas que se oponen a la otra? Creo que Subsonic es muy útil en términos de hacer las cosas rápidamente, pero en proyectos grandes tiende a no escalar, y vincula su modelo de dominio con su modelo de base de datos. Ahí es donde entra Nhibernate, ya que le proporciona POCOs ligeros que no están relacionados con su modelo de base de datos, pero el tiempo de configuración es mucho más largo.
¡Abrace la falta de coincidencia de impedancia!
:)
O no lo hagas. Si quieres rendimiento, hazlo tú mismo. Si lo quieres rápido y fácil, ve con NHibernate y ActiveRecord. Si le gusta fingir que realmente sabe lo que está sucediendo en el nivel de acceso a datos, use NHibernate y siéntese con XML todo el día para obtener muchos ... Muchos o simplemente ... err ... hágalo usted mismo - ADO.Net FTW!
Comenzamos con subsónico y ahora estamos tratando de evaluar si vamos a cambiar a nhibernate ahora que estamos en los puntos de dolor de subsónico.
Nuestra otra opción es crear un término medio en el que usemos subsónico para consultar y cargar objetos arbitrarios con su funcionalidad "ejecutar como lista escrita" que realiza un mapeo basado en el nombre de una declaración sql de estilo arbitrario de linq. O para intentar recrear algunos de ellos en nhibernate y refactorizar el resto.
Entonces, digo que subsónico tiene sentido en aplicaciones pequeñas, pero el mantenimiento en aplicaciones subsónicas se vuelve bastante difícil, tenemos momentos especialmente difíciles con la superposición de códigos de validación y eventos pre / post en códigos activados. Para un patrón de registro activo, el subsónico definitivamente tiene un 80%, pero hace algunas cosas de manera escasa y le impide tener un control real sobre su jerarquía de herencia, ya que cada clase debe heredar una tabla para volver a esa tabla.
Creo que debe apegarse a uno que pueda utilizar mejor. El objetivo final es la productividad y el código de calidad de buen desempeño. Si conoce SubSonic dentro y fuera, entonces manténgalo y si conoce NHibernate en profundidad, quédese con NHibernate. Esta es una pregunta muy subjetiva. También debe considerar el hecho de que los miembros de su equipo tienen experiencia. Si eres bueno en eso, podrás mantenerlo fácilmente.
He visto grandes proyectos usando SubSonic, mientras que NHibernate ya es famoso y se usa ampliamente.
La decisión de elegir ORM no depende únicamente del ORM en sí.
Creo que prácticamente lo has clavado. Subsonic genera código, por lo que sus objetos comerciales reflejarán la estructura de su base de datos. nHibernate utiliza archivos de mapeo que mapean sus objetos comerciales a la base de datos para que sus objetos puedan estructurarse como quiera.
¿Qué tan grande es un proyecto? ¿Se necesitará apoyo a largo plazo? ¿La rentabilidad de Subsonic va a compensar posibles problemas de escalado?
De nuevo un poco fuera de tema, pero voy a utilizar Castle ActiveRecord , en lugar de usar la base de datos como modelo (enfoque subsónico) o pasar horas en espagueti XML (enfoque NHibernate), simplemente coloca atributos en las clases de modelo.
Incluso puede obtener ActiveRecord para generar el esquema de la base de datos por usted.
Hemos utilizado este enfoque en bastantes proyectos ahora y los beneficios son los siguientes:
- Sencilla ruta de actualización a NHibernate si es necesario en el futuro
- Soporte para modelos de herencia simples , por ejemplo. Coche -> Vehículo
- El esquema que genera es muy probable que lo haya creado de todos modos, por lo que puede pasar más tiempo creando la aplicación en lugar de preocuparse por mantener su modelo / base de datos sincronizada.
El consejo que he recibido sobre el tema es que Subsonic no se escala para manejar escenarios más complejos y, por lo tanto, si sigue ese camino, terminará con un trabajo tratando de cambiar a un ORM más avanzado.
Por lo tanto, estoy más interesado en usar NHibernate para casos complejos, Castle Active Record para casos más simples y estoy atento a NHibernate Fluent, que debería facilitar mucho el mapeo de NHibernate (especialmente una vez que se mejora el soporte de mapeo basado en convenciones).
He evaluado ambos y creo que no sería justo recomendar uno sobre el otro sin comprender cuáles son sus objetivos. En su pregunta, expresó bien las diferencias y creo que ese debe ser su factor decisivo. Personalmente, he usado ambos y continuaré usando ambos dependiendo del proyecto.
- NHibernate es mi elección para proyectos a gran escala porque utiliza POCO ligeros. Si alguna vez cambiara mi ORM "Creo", sería mucho más fácil refactorizarlo.
- SubSonic es mi elección cuando tengo un proyecto de menor escala. Creo que el rendimiento de SubSonic escala bien. Sin embargo, me siento estrechamente unido a él porque está muy grabado en mi proyecto. En proyectos más pequeños todavía puedo cambiarlo porque la base del código es muy pequeña y realmente me ayuda a extraer el código como se anuncia.
Ligeramente fuera de tema, pero en una línea similar. ¿Has visto Castle ActiveRecord? Está escrito encima de NHibernate y elimina la necesidad de pasar tiempo creando asignaciones XML desde el código a la base de datos. Al igual que NHibernate, puede estructurar los objetos de su dominio como desee y luego generar un esquema de base de datos a partir de esta estructura.
Con ActiveWriter , una herramienta contribuida, puede asignar fácilmente desde su base de datos a objetos de dominio.
Me hacen mucho esta pregunta y realmente se trata de cuánto quieres tocar el violín. No puedo decirte cuán dañinos han sido los comentarios de Chris Cyvas sobre el escalado RE SubSonic, y he estado respondiendo a ellos desde entonces :(.
El trato es, en cuanto a rendimiento, SubSonic escala muy bien. En términos de crecimiento del proyecto: CUALQUIER herramienta que use requerirá su atención. Incluso NHibernate.
Escribí una publicación sobre cómo usar el patrón Repository con DI (como lo haría con NHIb o cualquier herramienta para ese caso) con SubSonic 2.1:
http://blog.wekeroad.com/blog/subsonic-writing-decoupled-testable-code-with-subsonic-2-1/
También escribí una publicación sobre el desempeño de SubSOnic:
http://blog.wekeroad.com/blog/subsonic-scaling/
Espero que esto ayude.
No puedo hacer una buena comparación ya que todavía no he usado NHibernate en un proyecto, pero he usado SubSonic y estoy muy contento con él. Hasta ahora, no he encontrado ningún obstáculo importante al usarlo.
Mira http://blog.wekeroad.com/blog/subsonic-writing-decoupled-testable-code-with-subsonic-2-1/ de Rob Conery, uno de los creadores de SubSonic. Habla sobre cómo desacoplar su código SubSonic del resto de la aplicación. Incluso menciona el hecho de que esta arquitectura le permitiría cambiar posteriormente SubSonic por alguna otra capa de acceso a datos como NHibernate o LINQ to SQL.
Sé que en realidad no respondí tu pregunta, pero espero que esto ayude.
Por lo que vale ... He tenido la oportunidad de usar ambas tecnologías bastante más desde que hice esta pregunta. Y tengo que quedarme, si estas tecnologías que eliges importan muy poco. Claro que NHibernate permite que sus entidades comerciales estén un poco menos acopladas a la estructura de su base de datos, pero todavía encuentro que hay muchas ocasiones en las que aún tiene que ceder a la voluntad de la base de datos.
En mi opinión, la única forma verdadera de DTOS completamente su Modelo de dominio de su Modelo de base de datos es escribir sus propios DTOS (esencialmente POCO para pasar datos), y luego asignarlos nuevamente a su ORM de elección en su capa de datos. Pero en la mayoría de los casos, este enfoque me resultará más complicado de lo que vale.
Puede considerar mirar NHibernate fluido; hace que administrar NHibernate sea muy fácil. No estoy seguro de lo difícil que sería la transición de un esquema existente, pero si está creando una nueva aplicación, es bueno definir el modelo de dominio y generar la base de datos en prácticamente cualquier servidor de DB que se le ocurra. Al leer los otros comentarios aquí, creo que Fluent NHibernate lleva a NHibernate a la par con SubSonic para facilitar la configuración.
Recientemente escribí una publicación de blog sobre .NET ORM que tiene Subsonic y ActiveRecord. Según mi experiencia, depende de lo que esté haciendo el proyecto, Subsonic funciona mucho mejor si vienes de un fondo SQL, pero NHibernate tiene más sobre él. ActiveRecord es bueno para proyectos más pequeños, no estoy convencido de que sea más rápido para proyectos más grandes que quedarse con NHibernate.
Recomendaría SubSonic si su proyecto funciona con la vista ActiveRecord de que la base de datos es su modelo. Obtendrá una clase por mesa y todo funciona mágicamente. Por supuesto, puede modificar y anular las cosas, pero si usted (o su proyecto) está en desacuerdo fundamentalmente con el enfoque de clase por tabla, miraría a NHibernate ya que comienza con el enfoque más complejo (pero más flexible) de mapear su modelo de dominio a su base de datos.
Si está utilizando una base de datos relativamente simple que está bajo su control (como en, puede cambiar las columnas sin enviar ocho formularios a una junta de revisión de supervisión de la división de la base de datos), le recomendaría comenzar con SubSonic y pasar a NHibernate si SubSonic no lo hace. satisfacer sus necesidades.
Tenga en cuenta el tamaño de su equipo y proyecto al considerar ActiveRecord.
En mi experiencia, ActiveRecord es una abstracción sobre NHibernate que comienza a gotear como un tamiz cuando se intentan escenarios más complicados.
Si tiene un esquema de moderado a muy complicado o no sencillo, quédese con NHibernate. Puedes cortarlo y cortarlo a la perfección.
El otro lugar donde podría tener problemas es cuando necesita una consulta moderadamente complicada. ActiveRecord oculta gran parte de la implementación de NHibernate ... pero lo necesitará para una consulta complicada, que se volverá muy difícil si no está completamente familiarizado con HQL. Tenga cuidado de que los miembros del equipo no solo corten los bordes en lugar de aprender NHibernate y HQL.