ORM à utiliser avec des bases de données à conception de schéma semi-flexible

c# dapper orm petapoco sql

Question

J'aime la "micro" approche de Dapper, Massive, PetaPoco etc. et j'aime contrôler le SQL que nous envoyons à la base de données, la plupart du temps c'est relativement simple. J'aime aussi travailler avec POCO, mais lorsque vous avez affaire à un schéma de conception assez flexible, vous rencontrez souvent des problèmes :)

Disons que nous avons une entité Personne, qui a TOUJOURS les propriétés suivantes.

  • Id
  • prénom
  • Email
  • Téléphone

Mais dans certains cas, il pourrait y avoir des propriétés supplémentaires comme

  • SpecialPhoneNumber
  • VeryCustomValue

Je voudrais vraiment un POCO avec les propriétés communes que nous savons être toujours là. Mais ayez l'autre accessible dans une collection clé / valeur.

Quelle serait la meilleure approche? Et l'un des "mirco-orm" mentionnés est-il en faveur de cela? Je les ai tous regardés mais je n'ai trouvé aucune indication, mais peut-être que je manque quelque chose.

Serait-il possible de le faire directement avec un SqlDataReader? ou la lecture de centaines de lignes serait-elle mauvaise lors de l’utilisation de la réflexion pour créer les objets? Les orm mentionnés semblent tout faire assez bien et je suppose que l'utilisation d'un DataReader en dessous.

J'espère que vous pouvez aider :)

EDIT: Je devrais probablement mentionner que nous n'avons aucun contrôle sur l'architecture de l'application. Il s’agit d’une solution ERP permettant à chaque client de personnaliser son application et la base de données sous-jacente. L'ajout de champs dans l'application ajoute des colonnes dans la base de données. Mauvais moi! pour ne pas le rendre clair en premier lieu

Réponse acceptée

Massive peut le supporter car il matérialise les données dans ExpandoObject :

La sauce secrète est le ExpandoObject. Tout ce qui entre et tout ce qui sort de Massive est un Expando - ce qui vous permet de faire ce que vous voulez avec. À la base, un ExpandoObject est juste un IDictionary <string, object>

ExpandoObject implémente IDictionary<string, Object> et IEnumerable<KeyValuePair<string, Object>> , de sorte que vous pouvez énumérer et tester les membres comme vous le souhaitez.

Par défaut, Massive émet une requête SELECT * , donc ExpandoObject contiendra tous les champs de la table, même ceux que vous ne connaissez pas.

Vous pouvez obtenir le code actuel de Massive auprès de Github .

Dapper peut également sélectionner des objets dynamiques, mais contrairement à Massive, il ne peut sélectionner que des données et ne peut pas les insérer, les mettre à jour ou les supprimer. EDIT: En examinant les documents Dapper, il semble qu’il puisse effectuer des modifications, car il peut exécuter n’importe quel sql. Il existe des informations plus récentes sur l'exécution d'insertions avec Dapper .


Réponse populaire

Vous pouvez jeter un oeil à la cartographie dynamique de nHibernate.

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

Il vous permet de récupérer ces propriétés étendues dans le Directory<string,object> générique Directory<string,object> . Ainsi, vous avez vos classes avec de tels sacs génériques (dictionnaires) et étendez dynamiquement le mappage XML.

nHibernate fera le reste pour vous.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi