ORM / Conseil de couche de persistance

Je commence un nouveau projet et je cherche un très bon ORM ou une couche de persistance non basée sur SQL.
Pour ce projet, je ne me soucie vraiment pas de la façon dont les données sont conservées, tant qu’elles peuvent être interrogées et stockées à une vitesse raisonnable et surtout avec des requêtes simples.
Les access simultanés doivent être gérés de manière transparente (le serveur frontal se trouvera sur un autre niveau et il y aura plusieurs utilisateurs simultanés, mais pas nécessairement sur les mêmes données). chargement etc) le mieux.
Je souhaite également éviter à tout prix de gêner les requêtes basées sur des chaînes afin que les outils prenant en charge LINQ ou les requêtes intuitives et éventuellement fortement typées obtiennent un gros bonus.
Enfin, travailler avec des objects POCO est une autre chose que j’aimerais vraiment faire.
Voici une liste des produits que j’ai évalués et la raison pour laquelle ils ne conviennent pas, afin que je ne voie aucun conseil concernant l’utilisation de ceux-ci:

  • NHibernate: contenu XML fou, configuration excessive, complexité et coûts de maintenance élevés pour les modifications de modèle, les usines de session sont en désordre et ne répondent pas à mes besoins
  • Castle ActiveRecord: sur la base de NHibernate, peu de documentation et certains problèmes liés à NHibernate s’appliquent toujours. De plus, pour obtenir des modèles corrects, il faut tellement d’atsortingbuts qu’il vaut mieux créer le schéma manuellement, et la façon dont les relations sont gérées est une honte.
  • Linq To SQL: objects POCO manquants et selon MS cela ne va pas améliorer beaucoup les heures supplémentaires (EF est ce à quoi ils sont engagés)
  • Entity Framweork: bien que dans la v4, les objects POCO soient possibles, ils restnt quand même assez hacky et vous obligent à effectuer trop de travail manuel pour mettre les choses en place. En outre, la v4 n’est qu’une version bêta
  • LLBLGen Pro: bien, surtout avec les adaptateurs SelfServicing, mais pas POCO. En outre, le fournisseur LINQ n’est pas encore parfait. Enfin, la suppression d’un groupe d’objects n’est pas possible via LINQ, ce qui entraîne le mélange d’API (dont l’une est loin d’être intuitive) et que je n’aime pas.
  • XPO: tout sauf intuitif, très lent, problèmes de simultanéité, pas POCO
  • SubSonic SimpleRepository: pendant quelques minutes, j’ai cru rêver. La dame prit fin alors que je comprenais comment la chose ne traitait pas les relations

J’ai également examiné MongoDB et CouchDB, mais dans ce cas, les captures d’objects associés semblaient nécessiter trop de tests avant de tout mettre en oeuvre. En outre, aucune d’entre elles n’offre des requêtes fortement typées.

Merci en avance pour vos suggestions!

Si vous pouvez vous permettre une licence LLBLGen, allez-y.

Je n’aime vraiment pas la syntaxe de requête LINQ au fur et à mesure que j’y travaille (bien que j’AIME les fonctionnalités de langage qui y sont associées, telles que les méthodes d’extension et les arbres d’expression).

J’ai adoré au début, comme tout le monde, mais je ne savais pas si [[where employee.Name.StartsWith (“John Smit”)]] dans ce fournisseur XYZ LINQ serait créé dans une instruction SQL ou dans LINQ to Objects ( résultats), et si [[user.Roles.Contains (rôle)]] fonctionnera ou non, est un grand pas en arrière.

LLBLGen permet de supprimer tous les éléments sans les charger aussi facilement que

MyEntityCollection.DeleteAll( new MyEntity {Condition = value} ); 

C’est assez simple et je l’aime bien. Vous obtenez un chargement paresseux et vous définissez un chargement rapide / profond par défaut et / ou par requête à l’aide de l’API Prefetch. Vous pouvez composer et construire dynamicment (et facilement) n’importe quel filtre / sorting / chargement à des niveaux infinis. C’est très gentil.

LLBLGen ne présente que deux problèmes: tout d’abord, c’est le prix que toutes les entresockets ne voudraient pas payer, en particulier compte tenu du battage médiatique de Microsoft. Deuxièmement, la convention de nommage bien que standard dans les théories sur les SGBDR), comme PredicateFactory au lieu de “où” ou “filtre” et Prefetch au lieu de chargement en profondeur et même de SortExpression au lieu de orderby, sont un peu effrayants pour un développeur qui les utilise pour la première fois. fois, mais bientôt vous apprendrez à les aimer, compte tenu du pouvoir et de la facilité qu’ils offrent. Il est question de la prise en charge de POCO dans LLBLGen 3.0. Je ne peux pas en parler parce que je ne sais pas.

Maintenant, étant donné que je ne travaille plus dans une société qui utilise LLBLGen, la société utilise LINQ to SQL principalement parce qu’elle est “éprouvée” dans de nombreux projets sans grands échecs (contrairement à EF 1, qui manque même de fonctionnalités LINQ to LINQ to SQL et a mauvaise performance et peut être assez limitant dans la cartographie avancée – ce qui devrait être mieux pour!). J’ai utilisé les deux dans cette entreprise et détesté les deux. La décision de créer de nouveaux projets est restée LINQ to SQL, et nous avons tout mis en œuvre pour surmonter ses limites. Ce site Web StackOVerflow lui-même fonctionne dessus !!! Vous pouvez contourner ce problème pour faire SEMI-POCO (vous devez toujours utiliser certains types liés à L2S en ce qui concerne les associations).

Je fais aussi quelques petits projets à la maison. Puisque je n’ai plus de licence LLBLGen, j’ai décidé d’apprendre NHibernate et de l’utiliser avec Fluent NHibernate et LINQ To NHibernate. J’ai appris grâce à cela que NHibernate est TRÈS fort. Cela a changé ma façon de travailler avec certaines fonctionnalités telles que la mise à jour automatique du schéma de firebase database (je n’ai jamais touché le D presque quand je l’utilise). Le fournisseur LINQ (dans le projet NHibernate Consortingb) manque parfois parfois, mais le code source non publié de NHibernate lui-même contient un meilleur fournisseur LINQ (je ne l’ai pas encore essayé). Lorsque vous effectuez un développement Web similaire à celui lié à DataContext dans L2S ou à ObjectContext dans EF, la “Session” de NHibernate (LLBLGen ne souffre pas de ces problèmes grâce aux entités de suivi automatique).

Le plus gros problème que j’ai eu avec NHibernate était la capacité de trouver des informations. Un trop grand nombre d’éléments qui devraient être assemblés d’une certaine manière et peu d’orientations peuvent inclure des informations avancées à la fois pour la cartographie et l’interrogation. Sinon, j’avais un ami (Tuna Toksoz, @tehlike sur Twitter) qui était un auteur du code source du projet NHibernate, je serais vraiment dans le pésortingn.

La morale que j’ai apprise est la suivante: si vous voulez quelque chose qui fonctionne et qui est assez basique, utilisez Linq To Sql ou SubSonic, si vous voulez quelque chose au milieu et que votre environnement de production puisse se permettre une version BETA .NET (étant donné que golive existe), utilisez Entity Framework 4.0. , si vous voulez quelque chose de très puissant et que vous pouvez vous permettre un dur processus d’apprentissage, allez à NHibernate ET, LE MEILLEUR DE TOUT, si vous pouvez vous permettre LLBLGen, UTILISEZ-LE.

Jetez un coup d’œil à DataObjects.Net :

Avantages:

  • Modèle économique facile à concevoir à l’aide de classes et d’atsortingbuts simples
  • Le schéma de firebase database est généré automatiquement au moment de l’exécution. Vous n’avez donc pas à vous soucier de la persistance des données.
  • Chargement paresseux automatique, persistance transparente, etc …
  • Très bonne implémentation de LINQ
  • Haute performance

Désavantages:

  • Pas POCO

En tout respect, j’ai tendance à être absolument en désaccord avec votre évaluation des faiblesses de NHibernate.

Je pense que les mappages XML sont extrêmement simples et intuitifs à créer. Ajouter une référence à NHibernate.dll et créer SessionFactory est également un jeu d’enfant. La gestion de la maintenance et des modifications est considérablement simplifiée. Les usines de sessions et les sessions sont très faciles à comprendre et à gérer.

Globalement, je pense que vous êtes émotif et non rationnel dans votre évaluation.

Avez-vous pensé à utiliser une firebase database orientée object telle que db4o . Bien que je ne l’utilise jamais, je l’ai trouvé assez intéressant quand je l’ai découvert:

Il supporte les requêtes LINQ, utilise des POCO, et si j’ai bien compris, les données sont simplement stockées dans un fichier (aucune installation de firebase database n’est requirejse).

Quelques liens: tutoriel , post sur le forum

LLBLGen.

Si vous pensez que vous allez trouver quelque chose qui coche toutes vos cases, vous risquez d’attendre longtemps.

Ecrivez votre propre ORM

Cela peut paraître fou, mais vous pouvez écrire votre propre ORM. À un moment donné dans un projet, le client ne voulait pas utiliser d’outils ou de bibliothèques tiers. C’est pourquoi nous avons écrit notre propre ORM, qui servait des objectives spécifiques. Vous pouvez décorer les classes et propriétés de vos objects avec des atsortingbuts pour les mapper avec des tables et des champs de firebase database. Ayez une classe de base pour tous les objects métier et effectuez des opérations de firebase database sur les objects en utilisant la reflection.

De cette façon, vous pouvez construire votre propre petit ORM pour répondre aux objectives particuliers que vous souhaitez.Pour votre référence, cela peut ressembler un peu à ceci.

 [TableMapping("Users", "User", "Users")] public class User : EntityBase { #region Constructor(s) public User() { } #endregion #region Properties #region Default Properties - Direct Field Mapping using DataFieldMappingAtsortingbute private System.Int32 _UserId; private System.Ssortingng _UserName; [DataFieldMapping("UserID")] [DataObjectFieldAtsortingbute(true, true, false)] [NotNullOrEmpty(Message = "UserID Is Required.")] public override int Id { get { return _UserId; } set { _UserId = value; } } [DataFieldMapping("UserName")] [NotNullOrEmpty(Message = "Username Is Required.")] public ssortingng UserName { get { return _UserName; } set { _UserName = value; } } #endregion #region One-To-Many Mappings #endregion #region Derived Properties #endregion #endregion } 

J’ai utilisé LLBLGenPro, NHibernate et quelques bases de données d’object.

Ma première recommandation serait que NHibernate avec FluentNhibernate gère les mappages.

J’ai trouvé que 90% de la difficulté liée à l’utilisation de NHibernate était directement liée aux mappages XML. Quand j’ai changé le FluentNhibernate, la douleur a disparu.

L’autre 10% de la difficulté est simplement l’ignorance; Je n’ai pas compris. Et ce n’est pas la faute de NHibernate.

LLBLGenPro: Je ne sais pas du tout à quoi ressemble le support Linq, mais avant que Linq ne soit pris en charge, c’était un PITA pour écrire des requêtes. J’ai lu la documentation et je l’ai eu, mais mes collègues ne l’ont pas fait et se sont plaints sans cesse de la complexité des chemins de prélecture, etc. De plus, comme vous l’avez dit – pas POCO. Ajouter le coût et je dirais que c’est beaucoup plus de problèmes que ça vaut la peine.

Si ce n’est pas une architecture client-serveur, je suggérerais db40. Je l’ai utilisé sur un petit projet privé et je l’ai aimé. Facile à utiliser. Super petite firebase database d’objects.

Jetez un coup d’œil à EntitySpaces . Je ne peux pas recommander par expérience personnelle, mais cela fonctionne très bien pour un de mes collègues (qui n’aime pas trop les sof …)

Jetez un coup d’oeil à Aspectize ici

Pour moi, la réponse s’est avérée être LLBLGen Pro. En plus de ses capacités, vous obtenez une équipe d’assistance dédiée qui veille à vous aider à faire fonctionner votre projet. Si vous rencontrez un bogue, dans la plupart des cas, vous aurez une solution en quelques heures ou quelques jours. Cela ne peut pas être minimisé, car cela vous permet de continuer votre travail plutôt que d’attendre une publication (des mois?) Ou de réparer le bogue vous-même.

Vous pouvez jeter un oeil à Telerik ORM . Je ne l’avais pas utilisé en production, mais c’était basé sur un ORM \ ODB Java appelé POET qui fonctionnait très bien pour moi il ya plusieurs années. Puisqu’il utilise l’amélioration de l’assemblage, il offre une expérience beaucoup plus transparente que certains des produits que vous avez rejetés ci-dessus.

En termes de pur ODB, FastObjects de Versant vaut probablement le détour.

Bonne chance – dites-nous ce que vous décidez de faire.