¿Cuáles son algunos de los beneficios de un "Micro-ORM"?

21

He estado investigando los llamados "Micro ORM" como Dapper y (en menor medida, ya que depende de .NET 4.0) Masivo, ya que estos podrían ser más fáciles de implementar en el trabajo que un ORM completo desde nuestro sistema actual depende en gran medida de los procedimientos almacenados y requeriría una refactorización significativa para trabajar con un ORM como NHibernate o EF. ¿Cuál es el beneficio de usar uno de estos en un ORM completo? Parece que fue una fina capa alrededor de una conexión de base de datos que todavía le obliga a escribir SQL prima - tal vez estoy equivocado, pero yo siempre me dijeron que la razón de ORM en el primer lugar es por lo que no tiene que escribir SQL, podría generarse automáticamente; especialmente para combinaciones de tablas múltiples y relaciones de mapeo entre tablas que son difíciles de hacer en SQL puro pero triviales con un ORM.

Por ejemplo, mirando un ejemplo de Dapper:

var connection = new SqlConnection(); // setup here...
var person = connection.Query<Person>("select * from people where PersonId = @personId", new { PersonId = 42 });

¿En qué se diferencia eso de usar una capa de datos ADO.NET enrollada, excepto que no tiene que escribir el comando, establecer los parámetros y supongo que mapear la entidad de nuevo usando un Builder. Parece que incluso podría usar una llamada a procedimiento almacenado como la cadena SQL.

¿Hay otros beneficios tangibles que me faltan aquí donde un Micro ORM tiene sentido para usar? Realmente no estoy viendo cómo está guardando algo sobre la forma "antigua" de usar ADO.NET, excepto tal vez unas pocas líneas de código; todavía tiene que escribir para averiguar qué SQL necesita ejecutar (que puede ser complicado) y todavía tiene que asignar relaciones entre tablas (la parte con la que más ayudan los ORM de IMHO).

Wayne Molina
fuente
+1: aún necesitará un lenguaje de consulta, pase lo que pase, así que puede seguir con algo familiar como linq o sql, pero devolver tipos anónimos como en su ejemplo no parece asignar un modelo relacional a un dominio concreto modelo. Eso se destaca como extraño para mí.
Steven Evers
Sí, no pude encontrar un ejemplo concreto de Dapper, en el sitio, literalmente, var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });y luego dog.First().Agepara acceder a las propiedades.
Wayne Molina
55
El ejemplo no devuelve un tipo anónimo, la palabra clave "var" se puede usar en lugar de un tipo concreto en C # para guardar la escritura adicional, esa consulta devolvería IEnumerable <Person>.
Ed James
1
La razón principal es una menor sobrecarga de tener que revisar constantemente los sprocs y luego recordar actualizar unas dos docenas de archivos SQL, sin mencionar que tienen que tener procs almacenados para el código CRUD trivial.
Wayne Molina
2
El principal beneficio de no usar sprocs para mantener todo el código (y yo uso el código a propósito aquí, incluido SQL y sus otros idiomas de elección) en el mismo sistema de control de versiones. Todavía tengo que encontrar una buena base de datos de base de datos cruzada VCS.
Ed James

Respuestas:

12

Beneficios:

  • Rendimiento similar a un SqlCommand sin procesar con DataReader y análisis.
  • No es necesario rodar su propia capa de conversión para DataReader.

Eso es más o menos, para ser honesto. Tienes un contenedor muy ligero para tus conexiones sql que hará la conversión de objetos por ti. Obviamente, puede ajustar las consultas sin tener que lidiar con ningún SQL autogenerado.

Contras:

  • Ni siquiera un poco seguro. Si comete un error tipográfico en el SQL, su servidor CI no lo detectará, tendrá que esperar que se detecte durante la IU automatizada o las pruebas funcionales.
  • Un dolor para mantener. Tiene un montón de instrucciones SQL en línea que realizan varias consultas que no tienen vínculos fuertes con la arquitectura de base de datos. Esto puede conducir fácilmente a consultas que se "quedan atrás" cuando cambia la estructura subyacente de la base de datos, que, de nuevo, no verá en el momento de la compilación.

Tienen su lugar, y son una herramienta muy efectiva que puede quitar algo del "trabajo burro" de los desarrolladores cuando interactúan con la base de datos, pero en realidad simplemente no pueden tomar el lugar de un ORM completo a gran escala. sistema para consultas que no son críticas para el rendimiento, simplemente debido al mayor costo de mantenimiento.

Si tiene dificultades con el rendimiento en las consultas de base de datos, le sugiero que sería mejor usar estos marcos de mapeo solo con procedimientos almacenados, para obtener una indicación en tiempo de compilación de si su SQL es válido (más los beneficios de rendimiento adicionales) .

Ed James
fuente
Hay bibliotecas que se pueden usar como envoltorio para estos micro orms que pueden reducir el problema que mencionas con los errores tipográficos. Por ejemplo: complemento de
Crud
3

En el sitio web de micro ORM PetaPoco , explica algunas ventajas con otros ORM. para explicar más

PetaPoco es un micro-ORM pequeño, rápido y de un solo archivo para .NET y Mono.

  • Al igual que Massive, es un archivo único que puede agregar fácilmente a cualquier proyecto
  • A diferencia de Massive, funciona con POCO fuertemente tipados
  • Al igual que Massive, ahora también es compatible con Expandos dinámicos: lea más
  • Al igual que ActiveRecord, admite una estrecha relación entre el objeto y la tabla de la base de datos.
  • Al igual que SubSonic, admite la generación de clases poco con plantillas T4
  • Al igual que Dapper, es rápido porque utiliza la generación dinámica de métodos (MSIL) para asignar valores de columna a propiedades
Christophe Debove
fuente
1

¿En qué se diferencia eso de usar una capa de datos ADO.NET enrollada, excepto que no tiene que escribir el comando, establecer los parámetros y supongo que mapear la entidad de nuevo usando un Builder. Parece que incluso podría usar una llamada a procedimiento almacenado como la cadena SQL.

Creo que ese es el principal beneficio de un Micro-ORM, para obtener los otros beneficios de un ORM necesitaría usar uno completo. Eso y el código es relativamente más pequeño, por lo que si necesita personalizarlo, sería más fácil.

BlackICE
fuente