ORM per l'uso con database con design di schema semi-flessibile

c# dapper orm petapoco sql

Domanda

Mi piace l'approccio "micro" di Dapper, Massive, PetaPoco ecc. E mi piace avere il controllo sull'SQL che inviamo al database, il più delle volte è relativamente semplice. Mi piace anche lavorare con POCO, tuttavia, quando si ha a che fare con un design di schema alquanto flessibile, si incontrano spesso problemi :)

Diciamo che abbiamo un'entità Person, che ha SEMPRE le seguenti proprietà.

  • Id
  • Nome
  • E-mail
  • Telefono

Ma in alcuni casi potrebbero esserci proprietà aggiuntive come

  • SpecialPhoneNumber
  • VeryCustomValue

Mi piacerebbe davvero un POCO con le proprietà comuni che sappiamo saranno sempre lì. Ma hanno l'altro accessibile in una collezione chiave / valore.

Quale sarebbe l'approccio migliore? E qualcuno dei citati "mirco-orm" supporta questo? Li ho guardati tutti ma non ho trovato alcuna indicazione che lo facciano, ma forse mi manca qualcosa.

Sarebbe possibile farlo direttamente con un SqlDataReader? o l'esecuzione della lettura di centinaia di righe sarebbe errata se si utilizza la riflessione per creare gli oggetti? Quelli citati sembrano tutti piuttosto bene e immagino che usi un DataReader sotto.

Spero che tu possa aiutare :)

EDIT: dovrei probabilmente dire che non abbiamo alcun controllo sull'architettura dell'applicazione. Questa è una soluzione ERP che consente al singolo cliente di personalizzare la propria applicazione e il database sottostante. L'aggiunta di campi nell'applicazione aggiunge colonne nel database. Bad me! per non averlo chiarito in primo luogo

Risposta accettata

Massive può supportarlo, perché materializza i dati in ExpandoObject :

La salsa segreta è ExpandoObject. Tutto ciò che entra e tutto ciò che esce da Massive è un Expando - che ti permette di fare tutto ciò che vuoi con esso. Al suo centro, un ExpandoObject è solo un IDictionary <stringa, oggetto>

ExpandoObject implementa IDictionary<string, Object> e IEnumerable<KeyValuePair<string, Object>> , in modo da poter enumerare e testare per i membri in qualsiasi modo sia necessario.

L'impostazione predefinita di Massive è l'emissione di una query SELECT * , quindi ExpandoObject conterrà tutti i campi della tabella, anche quelli che non conosci.

Puoi ottenere il codice corrente di Massive da Github .

Dapper può anche selezionare oggetti dinamici, ma a differenza di Massive può solo selezionare i dati e non può inserirli, aggiornarli o eliminarli. EDIT: rivedere i documenti di Dapper, sembra che possa eseguire modifiche, in quanto può eseguire qualsiasi sql. Ci sono alcune informazioni più recenti sull'esecuzione di inserimenti con Dapper .


Risposta popolare

Puoi dare un'occhiata alla mappatura dinamica di nHibernate.

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

Permette di recuperare tali proprietà estese nella Directory<string,object> generica Directory<string,object> . Quindi, hai le tue classi con questi sacchetti generici (dizionari) e estendi dinamicamente la mappatura XML.

nHibernate farà il resto per te.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow