NHibernate vs LINQ a SQL


Como alguien que no ha utilizado ninguna de las dos tecnologías en proyectos del mundo real, me pregunto si alguien sabe cómo se complementan entre sí y cuánto se superponen sus funcionalidades.

Author: Rex M, 2008-08-26

9 answers

LINQ to SQL le obliga a usar el patrón tabla-por-clase. Los beneficios de usar este patrón son que es rápido y fácil de implementar y se necesita muy poco esfuerzo para que su dominio se ejecute en función de una estructura de base de datos existente. Para aplicaciones simples, esto es perfectamente aceptable (y a menudo incluso preferible), pero para aplicaciones más complejas, los desarrolladores a menudo sugerirán usar un patrón de diseño impulsado por dominio en su lugar (que es lo que NHibernate facilitar).

El problema con el patrón de tabla por clase es que la estructura de la base de datos tiene una influencia directa sobre el diseño del dominio. Por ejemplo, supongamos que tiene una tabla de clientes con las siguientes columnas para contener la información de la dirección principal de un cliente:

  • streetAddress
  • Ciudad
  • Estado
  • Zip

Ahora, digamos que desea agregar columnas para la dirección de correo del cliente también para agregar las siguientes columnas a la Tabla de clientes:

  • MailingStreetAddress
  • MailingCity
  • MailingState
  • MailingZip

Usando LINQ a SQL, el objeto Cliente en su dominio ahora tendría propiedades para cada una de estas ocho columnas. Pero si estuviera siguiendo un patrón de diseño impulsado por dominio, probablemente habría creado una clase de dirección y su clase de cliente tendría dos propiedades de dirección, una para la dirección postal y otra para su dirección actual.

Eso es un ejemplo simple, pero demuestra cómo el patrón de tabla por clase puede conducir a un dominio un tanto maloliente. Al final, depende de ti. Una vez más, para aplicaciones simples que solo necesitan CRUD básica (crear, leer, actualizar, eliminar) funcionalidad, LINQ a SQL es ideal debido a la simplicidad. Pero personalmente me gusta usar NHibernate porque facilita un dominio más limpio.

Edit: @lomaxx - Sí, el ejemplo que utilicé fue simplista y podría haber sido optimizado para funcionar bien con LINQ to SQL. Yo quería manténgalo lo más básico posible para llevar a casa el punto. Sin embargo, el punto sigue siendo que hay varios escenarios en los que tener la estructura de su base de datos para determinar la estructura de su dominio sería una mala idea, o al menos conduciría a un diseño subóptimo de OO.

 112
Author: Kevin Pang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-10 14:57:12

Dos puntos que se han perdido hasta ahora:

También la nueva interfaz fluida para Nhibernate parece hacer que sea menos doloroso configurar el mapeo de Nhibernate. (Quitando uno de los puntos dolorosos del Nhibernate)


Actualizar

Linq to Nhiberate es mejor en Nhiberate v3 que ahora está en alpha. Parece que el Nhiberate v3 puede llegar a finales de este año.

El Entity Frame Work a partir de.net 4 también está empezando a parecer una opción real.

 26
Author: Ian Ringrose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-04 11:51:59

@ Kevin: Creo que el problema con el ejemplo que estás presentando es que estás usando un diseño de base de datos pobre. Yo habría pensado que había crear una tabla de clientes y una tabla de direcciones y se normalizaron las tablas. Si lo hace, definitivamente puede usar Linq To SQL para el escenario que está sugiriendo. Scott Guthrie tiene una gran serie de publicaciones sobre el uso de Linq Para SQL que le sugiero encarecidamente que revise.

No creo que se pueda decir que Linq y NHibernate complementan cada uno otros como eso implicaría que podrían ser utilizados juntos, y si bien esto es posible, es mucho mejor elegir uno y apegarse a él.

NHibernate le permite asignar sus tablas de base de datos a sus objetos de dominio de una manera muy flexible. También le permite usar HBL para consultar la base de datos.

Linq to SQL también le permite asignar sus objetos de dominio a la base de datos, sin embargo, utiliza la sintaxis de consulta Linq para consultar la base de datos

La principal diferencia aquí es que la La sintaxis de consulta Linq es comprobada en tiempo de compilación por el compilador para asegurar que sus consultas sean válidas.

Algunas cosas a tener en cuenta con linq es que solo está disponible en.net 3.x y solo es compatible con VS2008. NHibernate está disponible en 2.0 y 3.x, así como VS2005.

Algunas cosas a tener en cuenta con NHibernate es que no genera sus objetos de dominio, ni genera los archivos de asignación. Necesitas hacer esto manualmente. Linq can
haga esto automáticamente para ti.

 23
Author: lomaxx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-26 00:20:58

Fluent NHibernate puede generar sus archivos de asignación basados en convenciones simples. No hay escritura XML y fuertemente escrito.

Recientemente he trabajado en un proyecto, donde necesitábamos cambiar de Linq a SQL a NHibernate por razones de rendimiento. Especialmente la forma de L2S de materializar los objetos parece más lenta que la de NHibernate y la gestión del cambio también es bastante lenta. Y puede ser difícil desactivar la gestión del cambio para escenarios específicos donde no es necesario.

Si va a utilizar sus entidades desconectadas del DataContext - en escenarios WCF, por ejemplo - es posible que tenga muchos problemas para conectarlas al DataContext de nuevo para actualizar los cambios. No he tenido problemas con eso con NHibernate.

Lo que echaré de menos de L2S es principalmente la generación de código que mantiene las relaciones actualizadas en ambos extremos de las entidades. Pero supongo que hay algunas herramientas para que NHibernate haga eso también...

 7
Author: asgerhallas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-21 19:57:43

¿Puedes aclarar lo que quieres decir con "LINQ"?

LINQ no es una tecnología de acceso a datos, es solo una característica de lenguaje que admite consultas como una construcción nativa. Puede consultar cualquier modelo de objeto que soporte interfaces específicas (por ejemplo, IQueryable).

Muchas personas se refieren a LINQ A SQL como LINQ, pero eso no es del todo correcto. Microsoft acaba de lanzar LINQ A Entidades con.NET 3.5 SP1. Además, NHibernate tiene una interfaz LINQ, por lo que podría usar LINQ y NHibernate para obtener sus datos.

 5
Author: Jon Galloway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 21:45:57

Por LINQ, asumo que te refieres a LINQ para SQL porque LINQ, por sí mismo, no tiene ninguna base de datos "goings on" asociada con ella. Es solo un lenguaje de consulta que tiene una carga de azúcar syntac para que parezca SQL.

En el muy básico de los ejemplos básicos, NHibernate y LINQ to SQL parecen estar resolviendo el mismo problema. Una vez que obtenga el pase, pronto se dará cuenta de que NHibernate tiene soporte para muchas características que le permiten crear modelos de dominio verdaderamente ricos. También hay un LINQ para Proyecto NHibernate que le permite usar LINQ para consultar NHibernate de la misma manera que usaría LINQ para SQL.

 2
Author: Ryan Rinaldi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 21:49:20

Primero separemos dos cosas diferentes: El modelado de bases de datos se preocupa por los datos, mientras que el modelado de objetos se preocupa por las entidades y las relaciones.

La ventaja de Linq-to-SQL es generar rápidamente clases a partir del esquema de base de datos para que puedan usarse como objetos de active record (consulte definición del patrón de diseño de active record).

La ventaja de NHibernate es permitir flexibilidad entre el modelado de objetos y el modelado de bases de datos. La base de datos se puede modelar para reflejar mejor sus datos teniendo en cuenta el rendimiento, por ejemplo. Mientras que el modelado de objetos reflejará mejor los elementos de la regla de negocio utilizando un enfoque como el Diseño basado en dominios. (ver Kevin Pang comentario)

Con bases de datos heredadas con modelación y/o convenciones de nomenclatura deficientes, Linq-to-SQL reflejará estas estructuras y nombres no deseados en sus clases. Sin embargo, NHibernate puede ocultar este lío con los mapeadores de datos.

En proyectos nuevos donde las bases de datos tienen un buen nombre y de baja complejidad, Linq-to-SQL puede ser una buena opción.

Sin embargo, puede usar Fluent NHibernate con auto-mappings para este mismo propósito con mapping as convention. En este caso no te preocupes por los mapeadores de datos con XML o C# y deja que NHibernate genere el esquema de base de datos de tus entidades basado en una convención que puedes personalizar.

Por otro lado, la curva de aprendizaje de Linq-to-SQL es más pequeña que NHibernate.

 1
Author: Humberto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-06 16:35:53

O puedes usar el proyecto Castle ActiveRecords. He estado usando eso por un corto tiempo para aumentar algo de código nuevo para un proyecto heredado. Utiliza NHibernate y trabaja en el patrón active record (sorprendente dado su nombre que conozco). No lo he intentado, pero asumo que una vez que lo haya usado, si siente la necesidad de pasar directamente al soporte de NHibernate, no sería demasiado hacerlo para parte o todo su proyecto.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 22:13:14

Como usted escribió "para una persona que no ha utilizado ninguno de los" LINQ to SQL es fácil de usar para que cualquiera pueda usarlo fácilmente También admite procedimientos, lo que ayuda la mayor parte del tiempo. Supongamos que desea obtener datos de más de una tabla, luego escriba un procedimiento y arrastre ese procedimiento al diseñador y creará todo por usted, Supongamos que su nombre de procedimiento es "CUSTOMER_ORDER_LINEITEM" que obtiene el registro de todas estas tres tablas y luego escribe

MyDataContext db = new MyDataContext();
List<CUSTOMER_ORDER_LINEITEMResult> records = db.CUSTOMER_ORDER_LINEITEM(pram1, param2 ...).ToList<CUSTOMER_ORDER_LINEITEMResult>();

Usted puede utilizar registra el objeto en el bucle foreach también, que no es compatible con NHibernate

 0
Author: Ali Adravi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-20 19:01:52