Domanda

Sto cercando di sfruttare ORM dati i seguenti requisiti:

1) Uso di .NET Framework (l'ultimo Framework va bene)
2) Deve essere in grado di utilizzare Sybase, Oracle, MSSQL in modo intercambiabile
3) Lo schema è per lo più statico, MA ci sono parti dinamiche.

Conosco un po 'SubSonic e NHibernate, ma non profondamente.
Ho la fastidiosa sensazione che l'ORM possa fare ciò che voglio, ma al momento non so come sfruttarlo.

Probabilmente SubSonic non è ottimale, poiché al momento non supporta Sybase e la scrittura del mio provider è al di là delle mie risorse e capacità al momento.

Per il n. 3 (sopra), ci sono un paio di tabelle di metadati, che descrivono le tabelle che i fornitori possono " pinzare su " al database esistente.
Chiamiamo questi MetaTable e MetaField .

Esiste uno schema statico di base che l'ORM (NHibernate ATM) gestisce bene.
Tuttavia , un fornitore può aggiungere una tabella al database (fisicamente) purché aggiunga anche i dati alle tabelle dei metadati per descriverne la struttura.

Quello che mi piacerebbe davvero è che potessi in qualche modo " nutrire " l'ORM con quei metadati (in un modo che comprende) e averlo a quel punto mi permettono di manipolare i dati.

Il mio principale obiettivo è ridurre la quantità di generiche istruzioni SQL che devo fare su queste tabelle dinamiche.
Vorrei anche evitare di dovermi preoccupare delle differenze nell'invio di SQL a Sybase, Oracle o MSSQL.

Il mio problema principale è che non ho modo di far conoscere ORM sulle tabelle dinamiche fino al runtime, quando avrò accesso ai metadati

Modifica : un esempio di utilizzo potrebbe essere simile a quello delineato qui :

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

(Tuttavia, non sembra che SubSonic funzioni, poiché non esiste un provider Sybase (vedi sopra)

È stato utile?

Soluzione

Secondo questo blog puoi infatti utilizzare NHibernate con mappatura dinamica . Ci vuole un po 'di modifiche però ...

Altri suggerimenti

Abbiamo utilizzato parte di NHibernate, tuttavia abbiamo interrotto il progetto poiché non ci ha fornito il ROI desiderato. Abbiamo finito per scrivere il nostro livello ORM / SQL che ha funzionato molto bene (ha funzionato dal momento che non ci lavoro più, immagino che funzioni ancora).

Il nostro sistema ha utilizzato un progetto open source per generare l'SQL (non ricordare più il nome) e abbiamo creato tutte le nostre query nel nostro linguaggio basato su Xml (Query Markup Language - QML). Potremmo quindi creare un documento xml con selezioni, dove, gruppi ecc. E quindi inviarlo a SqlEngine che lo trasformerebbe in un'istruzione Sql ed eseguirlo. Discusse, ma mai implementata, una cache in tutto questo. Ciò ci avrebbe consentito di memorizzare nella cache Qmls per le query utilizzate di frequente.

Sono un po 'confuso su come verrebbe usato orm in fase di esecuzione? Se l'ORM costruisce in modo dinamico qualcosa in fase di runtime, come fa il codice di runtime a sapere cosa ha fatto in modo dinamico l'orm?

" a quel punto permettimi di manipolare i dati " - Cosa sta manipolando i dati?

Potrei mancare qualcosa qui e mi scuso se è così. (Ho usato solo l'approccio bottom-up con ORM)

IDataReader non associa nulla a un oggetto che conosci. Quindi il tuo esempio dovrebbe essere scritto usando il classico query builder.

Hai esaminato l'utilizzo di ADO.NET Entity Framework?

MSDN: LINQ to Entities

Ti consente di mappare le tabelle del database su un modello a oggetti in modo tale da poter codificare senza pensare a quale fornitore di database viene utilizzato e senza preoccuparti delle variazioni minori apportate da un DBA alle tabelle effettive. Il mapping viene mantenuto in file di configurazione che possono essere modificati quando le tabelle db vengono modificate senza richiedere una ricompilazione.

Inoltre, usando LINQ to Entities, puoi creare query in modo OO, quindi non stai scrivendo stringhe di query SQL effettive.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top