¿Cómo puedo aprovechar un ORM para una base de datos cuyo esquema se desconoce hasta el tiempo de ejecución?

StackOverflow https://stackoverflow.com/questions/136366

Pregunta

Estoy tratando de aprovechar ORM teniendo en cuenta los siguientes requisitos:

1) Uso de .NET Framework (el último Framework está bien)
2) Debe ser capaz de usar Sybase, Oracle, MSSQL de manera intercambiable
3) El esquema es mayormente estático, PERO hay partes dinámicas.

Estoy algo familiarizado con SubSonic y NHibernate, pero no profundamente.
Me da la molesta sensación de que el ORM puede hacer lo que quiero, pero no sé cómo aprovecharla en este momento.

Es probable que SubSonic no sea óptimo, ya que actualmente no es compatible con Sybase, y escribir mi propio proveedor ahora está más allá de mis recursos y capacidades.

Para el # 3 (arriba), hay un par de tablas de metadatos, que describen tablas en las que los proveedores pueden " grapar en " a la base de datos existente.
Llamemos a estas MetaTables y MetaFields .

Hay un esquema estático básico, que el ORM (ATM de NHibernate) maneja muy bien.
Sin embargo, , un proveedor puede agregar una tabla a la base de datos (físicamente) siempre que también agregue los datos a las tablas de metadatos para describir su estructura.

Lo que realmente me gustaría es que yo pueda de alguna manera " feed " El ORM con esos metadatos (de manera que lo entienda) y tenerlo en ese punto me permite manipular los datos.

Mi principal objetivo es reducir la cantidad de compilación de sentencias SQL genéricas que tengo que hacer en estas tablas dinámicas.
También me gustaría evitar tener que preocuparme por las diferencias en el envío de SQL a Sybase, Oracle o MSSQL.

Mi principal problema es que no tengo una manera de informar a ORM sobre las tablas dinámicas hasta el tiempo de ejecución, cuando tendré acceso a los metadatos

Editar : un ejemplo del uso podría ser como el de descrito aquí :

IDataReader rdr = new Query (" DynamicTable1 "). DONDE (" ArbitraryId ", 2) .ExecuteReader ();

(Sin embargo, no parece que SubSonic funcione, ya que no hay un proveedor de Sybase (ver arriba)

¿Fue útil?

Solución

De acuerdo con este blog, de hecho, puedes usar NHibernate con mapeo dinámico . Aunque se necesita un poco de ajuste ...

Otros consejos

Hicimos parte del uso de NHibernate, pero detuvimos el proyecto porque no nos proporcionó el ROI que queríamos. Terminamos escribiendo nuestra propia capa ORM / SQL que funcionó muy bien (funcionó porque ya no trabajo allí, supongo que todavía funciona).

Nuestro sistema utilizó un proyecto de código abierto para generar el SQL (ya no recuerdo el nombre) y creamos todas nuestras consultas en nuestro propio lenguaje basado en XML (lenguaje de marcado de consulta - QML). Luego podríamos construir un documento xml con selecciones, por qué, grupos, etc. y luego enviarlo al SqlEngine que lo convertiría en una declaración Sql y lo ejecutaría. Discutimos, pero nunca implementamos, un caché en todo esto. Eso nos hubiera permitido almacenar en caché los Qmls para consultas de uso frecuente.

¿Estoy un poco confundido en cuanto a cómo se usaría el orm en el tiempo de ejecución? Si el ORM generara dinámicamente algo en tiempo de ejecución, ¿cómo sabe el código de tiempo de ejecución qué hizo el orm dinámicamente?

" tenerlo en ese punto me permite manipular los datos " - ¿Qué es manipular los datos?

Puede que me falte algo aquí y aplico si ese es el caso. (Solo he utilizado realmente el enfoque de abajo hacia arriba con ORM)

IDataReader no asigna nada a un objeto que usted conoce. Por lo tanto, su ejemplo debe escribirse usando el generador de consultas clásico.

¿Ha investigado el uso del Entity Framework de ADO.NET?

MSDN: LINQ to Entities

Le permite asignar tablas de la base de datos a un modelo de objeto de tal manera que puede codificar sin pensar en qué proveedor de la base de datos se está utilizando, y sin preocuparse por variaciones menores hechas por un DBA a las tablas reales. La asignación se mantiene en archivos de configuración que se pueden modificar cuando las tablas de la base de datos se modifican sin requerir una recompilación.

Además, al usar LINQ para entidades, puede generar consultas de manera OO, por lo que no está escribiendo cadenas de consulta SQL reales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top