Expérience Subsonic ORM

Je recherche un nouvel ORM pour un projet important, je suis habitué à nHibernate avec ActiveRecord et j’ai déjà une très mauvaise expérience avec EF4, des performances et une interface graphique en panne.

Donc, recherche sur le Web, j’ai trouvé le Subsonic, j’ai aimé ce que j’ai lu dans la documentation.

Donc, j’aimerais savoir si quelqu’un a déjà utilisé le Subsonic et si l’expérience a été bonne.

Hmm… eh bien… comment devrais-je le dire…

Je déploie actuellement des efforts pour remplacer SubSonic par PetaPoco . Je suppose que ça dit quelque chose.

Ce n’est pas que SubSonic était exactement mauvais, mais cela ne me convenait pas vraiment. Et pour ceux qui cherchent à l’adopter à ce stade, il semble très important de noter le manque absolu d’activité du projet.

Premièrement, la principale raison pour laquelle SubSonic ne me convenait pas était LINQ.

Il est certain que le compilateur vérifie toutes les utilisations des propriétés, bien sûr. Cependant, dans la pratique, il n’était tout simplement pas bien adapté à l’interrogation.

Si vous vous en tenez à l’utilisation de classe par table et d’ActiveRecord, je suppose que ça va. Mais chaque fois que nous devions faire une requête au-delà de cela (quelque chose impliquant plusieurs tables ou quelque chose au-delà des clauses where les plus simples), c’était un cauchemar. Les associations ne peuvent pas être utilisées directement dans une requête SubSonic LINQ, comme c’est le cas dans EF ou nHibernate, qui était probablement le point le plus douloureux.

Par exemple, une requête comme celle-ci ne fonctionnera pas dans SubSonic, mais dans EF:

db.Accounts.Where(a => a.OwningUser.Email != null); 

Il m’est CodingHorror arrivé de faire plusieurs allers-retours dans la firebase database pour assembler un résultat, ou bien d’utiliser la classe CodingHorror de CodingHorror pour interroger directement avec SQL, sans pouvoir les matérialiser simplement en tant que POCO table).

J’ai également constaté que chaque fournisseur LINQ prend en charge différents ensembles d’opérations et que parfois, la même opération logique a une syntaxe et une utilisation légèrement différentes entre les fournisseurs. Cela a rendu l’écriture de la plupart des requêtes très longue et sujette aux erreurs. Le fournisseur LINQ de SubSonic ne manque pas de fonctionnalités originales et sous-représentées. Il n’est pas très proche de Linq-2-SQL, d’Entity Framework ou de LINQ pour répondre aux conditions des opérations sockets en charge, de la convivialité ou de la vitesse d’exécution (soyez prêt à apprendre de nouvelles façons d’écrire des jointures dans LINQ juste pour SubSonic – et être prêt à avoir des opérations communes ne sera tout simplement pas possible avec le fournisseur LINQ de SubSonic, bien qu’il soit connu depuis un an ).

Outre le ralentissement de la productivité, il est facile d’oublier que le code LINQ que vous écrivez est très spécifique au fournisseur. ANSI SQL est beaucoup plus standard et compatible que LINQ.

LINQ m’a également séduit par les possibilités de réutilisation de code avec des techniques telles que Specifications, mais leur création était loin d’être facile, et le résultat final ne valait même pas la peine. Les obstacles que j’ai rencontrés ici sont dus en grande partie au fait que le fournisseur LINQ de SubSonic n’a pas pris en charge les associations.

Les installations de SubSonic en dehors de LINQ me semblaient au mieux médiocres (à mon avis).

Deuxièmement, il est important de savoir que, à tous égards, SubSonic n’est pas un projet actif.

Rob Conery, le créateur initial de SubSonic, ne travaille plus sur le projet. Le dernier engagement commis par Rob remonte à juillet 2010 .

Le dernier engagement concernant le projet remonte à trois mois , malgré près de 100 problèmes en suspens . Et pour autant que je sache, il n’y a pas eu de sortie, pas même une sortie mineure, depuis que Rob a cessé de travailler sur SubSonic (bien que les gens qui traînent encore autour du projet parlent d’une sortie depuis plus de six mois ). .

Auparavant, le groupe Google pour SubSonic était actif, mais pas beaucoup. Et aussi le site Web officiel du projet SubSonic est un écran jaune de la mort depuis un moment (le site n’est plus des écrans jaunes).

La nouvelle hotness dans l’access aux données est micro-ORM. Le créateur de SubSonic a en fait lancé en quelque sorte cette tendance avec Massive , suivi peu après par l’équipe de StackExchange qui a publié Dapper , puis par PetaPoco . Il y en a deux autres aussi. Et pendant que nous abandonnons un peu la vérification du compilateur en ayant des extraits SQL dans notre base de code, je trouve que le micro-ORM correspond beaucoup mieux à mon style de développement que SubSonic.

Selon mon expérience (bien que limitée) avec nHibernate, c’est excessivement compliqué dans la plupart des scénarios, et même lorsque cela est approprié, les temps de démarrage de mon application ont été totalement assassinés. Il y avait aussi une courbe d’apprentissage élevée (que vous avez peut-être dépassée), mais il y a également plusieurs façons de le faire… essentiellement tout… donc cela ajoute simplement beaucoup plus de décisions dans mon processus (me ralentissant).

Avec PetaPoco, je peux écrire du SQL familier – je suis rapide et raisonnablement bon avec ça – et le matérialiser dans des POCO, ce que je sais faire avec le diable tout de suite. Un peu de l’architecture et de l’organisation, des tests d’intégration automatisés et je ne me sens pas du tout mal à l’aise d’incorporer des éléments de SQL.

Oh, et je suppose que la dernière chose à faire: SubSonic est loin d’être le moyen le plus rapide d’obtenir des données. Peut-être pas important, mais cela s’est avéré être pour nous.

En conclusion (désolé pour le mur de texte):

Ce n’est pas que SubSonic soit mauvais au sens absolu. Cela ne semblait tout simplement pas correspondre à la façon dont j’ai essayé de bien l’utiliser – et c’est en grande partie parce que LINQ est toujours une abstraction qui fuit et qu’elle fuit de différentes manières que d’habitude.

Le fait que les efforts de développement soient quasi inexistants est bon ou mauvais. Bon, il est stable et considéré comme “fini” dans un sens. Mauvais, il manque de fonctionnalités, peut-être quelques bugs, et n’est pas le meilleur interprète – et personne ne travaille pour l’améliorer.

Il y a quelque temps, je cherchais un ORM simple pour une petite application et SubSonic était exactement ce dont j’avais besoin. L’installation est facile et je n’ai pas eu besoin de beaucoup de temps pour append de la persistance à mes classes de domaine. Ce que j’ai aimé, c’est l’option d’automatiser le modèle de firebase database en fonction des classes de domaine.

L’inconvénient est que le jeu de fonctionnalités est plutôt limité. Ce qui m’a le plus manqué, c’est l’option permettant d’extraire des graphiques d’object complets et de prendre en charge des index supplémentaires. SubSonic peut être utilisé comme outil de persistance pour les petites applications, mais j’aimerais utiliser nHibernate ou un ORM commercial comme LLBLGen pour les applications importantes ou volumineuses.

Avant de choisir un ORM, vous devez définir les exigences de base en matière d’access aux données. Voulez-vous utiliser le modèle d’enregistrement actif ou le modèle d’adaptateur? Qu’en est-il de la simultanéité, des performances, de l’inheritance, etc …

J’ai utilisé Supersonic, tant que vous utilisez des requêtes simples. Quand j’ai commencé à avoir des requêtes plus complexes, j’ai constaté qu’il manquait les fonctionnalités de LINQ. Après avoir googlé un peu, je suis passé à http://bltoolkit.net , et à partir de ce moment-là (environ 2 ans maintenant), j’en suis très heureux. Plus est l’un des ORM les plus rapides selon http://ormeter.net/ . Jetez un coup d’oeil, vous ne le regretterez pas.