orm dapper dapper-rainbow

orm - Dapper.Rainbow VS Dapper.Contrib



dapper-rainbow (3)

He estado utilizando Dapper desde hace un tiempo y me he preguntado sobre qué eran los proyectos de Contrib y Rainbow . Después de un poco de revisión del código, aquí están mis pensamientos sobre sus usos:

Dapper.Contrib

Contrib proporciona un conjunto de métodos de extensión en la interfaz IDbConnection para operaciones CRUD básicas:

  • Obtener
  • Insertar
  • Actualizar
  • Borrar

El componente clave de Contrib es que proporciona seguimiento para que sus entidades identifiquen si se han realizado cambios.

Por ejemplo, usar el método Get con una interfaz como restricción de tipo devolverá una clase proxy generada dinámicamente con un diccionario interno para rastrear qué propiedades han cambiado.

A continuación, puede utilizar el método de actualización que generará el SQL necesario para actualizar solo las propiedades que han cambiado.

Mayor advertencia : para obtener la bondad de seguimiento de Contrib, debe usar una interfaz como su restricción de tipo para permitir que se genere la clase de proxy.

Dapper.Rainbow

Rainbow es una clase abstracta que puedes utilizar como clase base para tus clases Dapper para proporcionar operaciones CRUD básicas:

  • Obtener
  • Insertar
  • Actualizar
  • Borrar

Además de algunos métodos de uso común como First (obtiene el primer registro en una tabla) y All (obtiene todos los registros de resultados en una tabla).

Para todos los efectos, Rainbow es básicamente un contenedor para las interacciones de base de datos más utilizadas y creará el aburrido SQL en función de los nombres de propiedad y las restricciones de tipo.

Por ejemplo, con una operación Get, Rainbow creará una consulta SQL de vanguardia y devolverá todas las columnas y luego correlacionará esos valores con el tipo utilizado como restricción.

De forma similar, los métodos de inserción / actualización construirán dinámicamente el SQL necesario para una inserción / actualización basada en los nombres de propiedad de la restricción de tipo.

Mayor advertencia : Rainbow espera que todas sus tablas tengan una columna de identidad llamada "Id".

Diferencias?

La principal diferencia entre Contrib y Rainbow es (IMO), uno hace un seguimiento de los cambios en sus entidades, el otro no:

  • Use Contrib cuando quiera poder seguir los cambios en sus entidades.
  • Use Rainbow cuando desee usar algo más en la línea de un enfoque estándar de ADO.NET.

En una nota al margen: me hubiera gustado haber visto Rainbow antes, ya que he creado una clase base muy similar a la que uso con Dapper.

Del artículo y cita @anthonyv citado: Ese molesto problema INSERT, obteniendo datos en el DB

Ahora hay otras 2 API de las que puedes elegir ( además de Rainbow ) (para CRUD) Dapper.Contrib y Dapper Extensions . No creo que sea igual para todos. Dependiendo de su problema y preferencias, puede haber una API que funcione mejor para usted. Traté de presentar algunas de las opciones. No hay una bendita "mejor manera" de resolver cada problema en el mundo.

Sospecho que lo que Sam intentaba transmitir en la cita anterior y la publicación de blog relacionada fue: su escenario puede requerir una gran cantidad de mapas personalizados (use Dapper vainilla), o puede necesitar hacer un seguimiento de los cambios de entidad (usar Contrib), o puede tienen escenarios de uso común (use Rainbow) o puede usar una combinación de todos ellos. O ni siquiera usas Dapper. YMMV.

¿Puede alguien explicar la diferencia entre Dapper.Rainbow vs. Dapper.Contrib ?

Me refiero a cuándo usas SqlMapperExtensions.cs de Dapper.Contrib y cuándo deberías usar Dapper.Rainbow?


Sam describe en detalle cuál es la diferencia en su publicación: http://samsaffron.com/archive/2012/01/16/that-annoying-insert-problem-getting-data-into-the-db-using-dapper .

Básicamente, es la respuesta habitual, no de 1 medida, y depende de nosotros decidir qué enfoque se debe seguir en función de sus necesidades:

Ahora hay otras 2 API de las que puedes elegir ( además de Rainbow ) (para CRUD) Dapper.Contrib y Dapper Extensions . No creo que sea igual para todos. Dependiendo de su problema y preferencias, puede haber una API que funcione mejor para usted. Traté de presentar algunas de las opciones. No hay una bendita "mejor manera" de resolver cada problema en el mundo.


Esta publicación de Adam Anderson describe las diferencias entre varias bibliotecas de extensión CRUD Dapper:

  • Dapper Contrib ( Seguimiento automático de cambios: solo si está sucio o no, Atributos para mapeo personalizado, Sin soporte de clave compuesta, Sin soporte de clave manual)
  • Dapper Rainbow (Seguimiento manual de cambios utilizando Snapshotter, Atributos para mapeo personalizado, Sin soporte de clave compuesta, Sin soporte de clave manual)
  • Dapper Extensions (Sin seguimiento de cambios, Configuración fluida para asignación personalizada, Admite claves compuestas, Admite especificación de clave manual), también incluye un sistema de predicados para consultas simples
  • github.com/ericdc1/Dapper.SimpleCRUD (Sin seguimiento de cambios, Atributos para mapeo personalizado, Sin soporte de clave compuesta, Admite especificación de clave manual), también incluye ayudantes de filtrado / paginación, soporte asíncrono, generación automática de clase POCO (a través de T4)