ORM para usar con bases de datos que tienen un diseño de esquema semiflexible

c# dapper orm petapoco sql

Pregunta

Me gusta el enfoque "micro" de Dapper, Massive, PetaPoco, etc. y me gusta tener control sobre el SQL que enviamos a la base de datos, la mayoría de las veces es relativamente simple. También me gusta trabajar con POCO, pero cuando se trata de un diseño de esquema algo flexible, a menudo se encuentra con problemas :)

Digamos que tenemos una entidad Person, que SIEMPRE tiene las siguientes propiedades.

  • Carné de identidad
  • Nombre
  • Email
  • Teléfono

Pero en algunos casos puede haber propiedades adicionales como

  • SpecialPhoneNumber
  • VeryCustomValue

Realmente me gustaría un POCO con las propiedades comunes que sabemos que siempre estarán allí. Pero tiene el otro accesible en una colección clave / valor.

¿Cuál sería el mejor enfoque? ¿Y alguno de los mencionados "mirco-orms" apoya esto? Los he visto a todos pero no he encontrado ninguna indicación de que lo hagan, pero tal vez me esté perdiendo algo.

¿Sería posible hacer esto directamente con un SqlDataReader? o sería malo el rendimiento de leer cientos de filas al usar la reflexión para crear los objetos? Los orms mencionados parecen funcionar bastante bien y supongo que usan un DataReader debajo.

Espero que puedas ayudar :)

EDIT: probablemente debería mencionar que no tenemos control sobre la arquitectura de la aplicación. Esta es una solución ERP que permite al cliente individual personalizar su aplicación y la base de datos subyacente. Agregar campos en la aplicación agrega columnas en la base de datos. ¡Mal mi! por no dejar eso en claro en primer lugar

Respuesta aceptada

Massive puede soportar esto, porque materializa datos en ExpandoObject :

La salsa secreta es el ExpandoObject. Todo lo que entra y todo lo que sale de Massive es un Expando, que te permite hacer lo que quieras con él. En esencia, un ExpandoObject es solo un IDictionary <string, object>

ExpandoObject implementa IDictionary<string, Object> e IEnumerable<KeyValuePair<string, Object>> , por lo que puede enumerar y probar miembros de cualquier forma que necesite.

El valor predeterminado de Massive es emitir una consulta SELECT * , por lo que el ExpandoObject contendrá todos los campos de la tabla, incluso aquellos que no conoce.

Puedes obtener el código actual de Massive de Github .

Dapper también puede seleccionar objetos dinámicos, pero a diferencia de Massive, solo puede seleccionar datos y no puede insertarlos, actualizarlos ni eliminarlos. EDITAR: Al revisar los documentos Dapper, parece que puede realizar modificaciones, ya que puede ejecutar cualquier sql. Hay información más reciente sobre la realización de insertos con Dapper .


Respuesta popular

Puede echar un vistazo al mapeo dinámico de nHibernate.

http://ayende.com/blog/3942/nhibernate-mapping-dynamic-component

Le permite recuperar tales propiedades extendidas en el Directory<string,object> genérico Directory<string,object> . Por lo tanto, tiene sus clases con tales bolsas genéricas (diccionarios) y extiende dinámicamente el mapeo XML.

nHibernate hará el resto por ti.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué