2009-10-01 4 views
3

J'ai un tas de POCO que j'ai créés et pour lesquels je veux créer une couche persistante. Chose est, je me fous de la façon dont les données sont stockées dans SQL Server, je veux juste qu'il soit stocké. En d'autres termes, je veux dire à l'outil ORM, "Voici quelques classes POCO, les enregistrer." et ne pas avoir à faire autre chose. Existe-t-il un outil ORM pour C# capable de faire cela? J'ai eu du mal à faire fonctionner Fluent NHibernate et Subsonic ne supporte pas les relations, ce qui rend les choses comme "Obtenir tous les commentaires pour un seul article" assez difficile. Il doit être capable de générer automatiquement un schéma de base de données sans que je doive définir un tas d'attributs et ainsi de suite.Existe-t-il un outil ORM pour C# capable de «mettre en boîte noire» la base de données?

+0

Cela devrait être aussi simple qu'itérer 'Post.Comments' ... –

+0

Oui, si vous utilisez ActiveRecord et que vous allez en bas. Cependant, je fais de haut en bas en utilisant SimpleRepository, et jusqu'à présent, il ne supporte pas encore les relations. –

+0

Les problèmes ont tendance à apparaître lorsque le groupe de rapports souhaite interroger le schéma généré automatiquement dans six mois. Personnellement, je conçois mes cours, conçois mes tables et mes relations (éventuellement avec l'aide d'administrateurs de bases de données), puis les cartographie. – TrueWill

Répondre

2

J'utilise personnellement Fluent NHibernate et il fait pour moi ce dont vous avez besoin. Eh bien, presque. Il y a quelque chose comme le besoin de spécifier manuellement ManyToMany mais vous ne pouvez pas l'éviter. Et si vous voulez concevoir de bonnes entités, vous devez rendre certains membres privés, ce qui désactive l'automapping pour ces membres. Pourtant, j'ai changé BEAUCOUP de design et je n'ai même jamais pensé à la façon dont mon DB est changé (un luxe d'un nouveau projet, mais ...).

Avez-vous regardé Castle ActiveRecord? Avez-vous vraiment besoin de vrais POCO, ou vous pouvez vivre avec des attributs et .Save sur les entités? Eh bien, je l'éviterais mais cela pourrait marcher pour vous.

+0

Deux problèmes que j'ai rencontrés avec Fluent NHibernate en utilisant l'automapping étaient: 1. ça craquait quand j'essayais d'utiliser une colonne Dictionary, et 2. ça ne mappait pas les enums, dont j'ai une tonne.Le premier problème est compréhensible (j'aurais dû envelopper la paire clé/valeur dans une classe à la place), mais je n'ai pas trouvé de solution pour la seconde. –

+0

J'utilise enums sans problèmes. J'ai eu des problèmes avec cela, mais Google a aidé avec des solutions simples. Il y a beaucoup de questions à ce sujet ici, et c'était facile à résoudre. Je ne peux pas dire exactement maintenant, mais je viens d'ajouter IPropertyConvention aussi loin que je me souvienne, qui dit d'utiliser GenericEnumMapper pour enums, voir http://stackoverflow.com/questions/439003/how-do-you-map-an-enum -as-an-int-value-with-fluent-nhibernate, bien que vous souhaitiez utiliser CustomTypeIs (typeof (int)). Quoi qu'il en soit, ce n'est pas le plus gros problème avec FNH ;-) – queen3

+0

Il s'avère que Fluent NHibernate 1.0 RTM peut très bien automatiser les enums (pour les chaînes cependant), mais ne peut pas faire de collection d'enums. Regarder si c'est possible ou pas maintenant. –

1

Découvrez Subsonics SimpleRepository. Créez une classe, créez une base de données, attribuez une chaîne de connexion à Subsonic et manipulez le reste. Nifty.

+0

SimpleRepository ne prend pas en charge la génération de relations. C'est bien si vous avez des objets simples qui n'ont pas besoin de relations (comme un seul billet de blog), mais que faites-vous dans les situations où vous avez besoin d'une relation (comme les commentaires qui appartiennent à un poste particulier)? –

0

Jetez un oeil à eXpress Persistent Objects de DevExpress

+0

Je l'ai regardé, mais comme vous devez hériter de XPObject, il transforme les objets POCO en objets prenant en compte la persistance. –

6

Vous pouvez essayer DataObjects.Net, mais ce n'est pas exactement ce que vous recherchez. Tout d'abord, ses entités ne sont pas poco, vous devez les hériter de certains types de base. Deuxièmement, vous devez marquer les champs que vous souhaitez enregistrer avec un attribut spécial.

Alors pourquoi je recommande DataObjects alors? Parce que je pense que c'est complètement la base de données des boîtes noires. Vous faites juste un tas d'objets et demandez à ORM de les sauvegarder.

  • Il génère automatiquement un schéma de base de données dans le SGBDR spécifié au moment de l'exécution.
  • Vous n'avez pas à appeler des méthodes comme .Save() pour enregistrer les modifications, il suffit de travailler comme avec les objets habituels.
  • Vous n'avez pas besoin d'écrire des requêtes SQL - il prend entièrement en charge LINQ.
  • Vous n'avez pas à gérer les scripts SQL même lorsque la base de données existante est mise à niveau vers la version suivante. Subsonic supporte les relations s'il y a des relations de clé étrangère dans la base de données.
Questions connexes