2009-08-07 8 views
4

Je suis nouveau sur NHibernate et l'aspect de la configuration m'a toujours semblé excessivement onéreux. Hier, je suis tombé sur les fonctions de cartographie automatique de Fluent NHibernate et j'ai été impressionné.Fluent NHibernate. Auto Mapping et conventions

Pour me former, je me suis lancé le défi d'essayer le 'Getting Started First Project' (http://wiki.fluentnhibernate.org/show/GettingStartedFirstProject) en utilisant AutoMappings et Conventions. Je dois admettre ne pas avoir beaucoup de chance.

Pour summise mes pas:

J'ai fait quelques modifications mineures au schéma de base de données dans l'exemple, principalement pour éliminer les underscores des clés étrangères (c.-à-Product_id à ProductId) car cela apporterait plus en ligne avec notre normes de nommage de base de données. Q1) J'ai essayé d'écrire une implémentation de IHasManyConvention en utilisant ForeignKeyConvention comme exemple mais la méthode WithKeyColumn ne semble pas exister (je suppose que c'est parce que j'ai téléchargé hier la construction donc le design a changé depuis que l'article a été écrit). Comment puis-je rectifier cela? J'ai également apporté quelques modifications mineures à la couche Entités dans l'exemple car je pensais que cela faciliterait la tâche, ils devaient renommer StoresStockedIn en Stores (Product.cs) et Staff en Employees (Store.cs).

Mon code ressemble à ceci:

var cfg = Fluently.Configure() 
.Database(MsSqlConfiguration.MsSql2005 
    .ConnectionString(c => c 
     .Is(connectionString))) 
.Mappings(m => m.AutoMappings.Add(
       AutoPersistenceModel.MapEntitiesFromAssemblyOf<Store>() 
        .Where(t => t 
         .Namespace == "FluentNHibernateTesting.Entities") 
         .ConventionDiscovery.Setup(c => c.Add<ForeignKeyConvention>()) 
       )) 
.BuildSessionFactory(); 

Je puis essayer d'ajouter les magasins, les produits et les employés à la base de données par exemple l'obtention commencé. L'exception que j'obtiens se produit sur la validation et est:

objet référence une instance transitoire non enregistrée - enregistrer l'instance transitoire avant le vidage. Type: FluentNHibernateTesting.Entities.Employee, Entité: FluentNHibernateTesting.Entities.Employee

Q2) Comment résoudre ce problème? Je comprends (à partir de ma lecture limitée) qu'il a quelque chose à voir avec la mise en place des éléments en cascade des relations d'objet correctement, mais je suis un peu perplexe sur la façon de s'y prendre efficacement en utilisant Auto Mapping. Q3) Y at-il une date de sortie cible pour le projet Fluent? Je (comme je suppose beaucoup d'autres) pense que c'est une excellente initiative, mais je suis conscient de l'utiliser à moins qu'il ne soit dans un état stable.

Q4) Il est mentionné dans de nombreux blogs qu'ils travaillent régulièrement vers la parité des fonctionnalités de Fluent avec hbn.xml. Y at-il une liste de ces fonctionnalités manquantes quelque part afin d'aider à l'évaluation et l'utilisation de cet outil?

Appréciez l'aide à l'avance.

Répondre

1

J'ai posé à James Gregory les mêmes questions dans un courriel directement à lui. Il a fourni cette excellente réponse.

« Hey Paul,

1) KeyColumnNames est ce que vous êtes après.

2) Vous pouvez le faire de l'une des trois façons suivantes. Configurez une IHasManyConvention pour globaliser toutes les relations en cascade, utilisez un appel ForTypesThatDeriveFrom ou un remplacement automatique.

3) Nous sommes en test privé de notre version 1.0 maintenant. Nous ne sommes pas sûrs que nous aurons une version bêta publique ou une version directe, mais cela devrait se produire dans les prochaines semaines.

4) Il est très improbable que nous soyons complètement complets avec NHibernate, nous n'avons aucun désir de l'être. La plupart des fonctionnalités de NH sont extrêmement ésotériques et il y a peu d'avantages à les mettre en œuvre. À partir du 1.0, il y aura très peu de fonctionnalités que nous ne supportons pas que les gens utilisent régulièrement. Je peux dire en toute confiance que tous les scénarios de cartographie courants sont pris en compte, et s'il y a quelque chose qui ne l'est pas, vous pouvez toujours revenir à hbm pour ce cas.

Pour préempter des commentaires que nos documents sont à jour, la documentation va être remis à neuf à 1,0;)

James

Merci James.

0

Y a-t-il une date de sortie cible pour le projet Fluent ? Je (comme je suppose beaucoup de autres) pense que c'est une excellente initiative mais je suis soucieux de l'utiliser à moins qu'il ne soit dans un état stable.

Vous devriez être en mesure d'obtenir une version fonctionnelle de Fluent nHibernate à partir de leur dépôt SVN maintenant. Ils ont aussi des binaires compilés.

Il n'y a actuellement aucune version officielle de Fluent NHibernate. Ce n'est pas un reflet de la qualité, mais de notre rythme rapide de changement.Notre base de code est mise à jour quotidiennement, ce qui rend inutile la publication de versions officielles tant que nous n'aurons pas atteint la parité avec NHibernate Core. La plupart des fonctionnalités standard que vous utilisez au quotidien sont prêtes.

http://fluentnhibernate.org/downloads

Les enjeux actuels sont ici:

http://code.google.com/p/fluent-nhibernate/issues/list

Aucun d'entre eux semblent être des tueurs-traitent. Je suppose que cela dépend du temps que vous avez à expérimenter.

0

objet fait référence à un transitoire non enregistré par exemple - sauvegarder avant de rincer l'instance transitoire . Type: FluentNHibernateTesting.Entities.Employee, Entité: FluentNHibernateTesting.Entities.Employee

Si vous vous opposez Google fait référence à une instance transitoire non enregistrées, vous trouverez plusieurs matchs pour cela. Votre meilleur pari est de commencer à passer par ceux-ci et dépannage. Pour l'anecdote, d'après ce que j'ai lu, le message d'erreur signifie exactement ce qu'il dit, ou il y a une relation many-many ou en cascade qui n'est pas mise à jour.