3 votes

Mapping fluide - entités et classmaps dans différents assemblages

Lors de l'utilisation de la configuration fluente pour spécifier des mappages fluents comme celui-ci :

.Mappings(m => m.FluentMappings.AddFromAssembly(typeof(UserMapping).Assembly))

Pour l'instant, j'obtiens une erreur "NHibernate.MappingException : No persister for".

Le fait que mes entités et mes ClassMaps se trouvent dans des assemblages différents pose-t-il un problème ? On peut supposer que AddFromAssembly s'intéresse à l'assembly qui contient les ClassMaps, et non les Entités ? (c'est ce que j'ai supposé)

Merci de votre attention !

UPDATE :

Désolé de ne pas avoir répondu aux réponses très rapidement - j'ai dû voyager à l'improviste après avoir fixé la prime.

Quoi qu'il en soit, merci pour vos réponses. J'y ai jeté un coup d'œil et j'ai mis à jour mon code pour utiliser AddFromAssemblyOf plutôt que AddFromAssembly, mais j'obtiens toujours la même erreur. Il est possible que je fasse quelque chose de stupide. Voici le code complet de la fabrique de session que j'utilise :

public class NHibernateHelper
    {
        private static ISessionFactory _sessionFactory;
        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    var mysqlConfig = FluentNHibernate.Cfg.Db.MySQLConfiguration
                        .Standard
                        .ConnectionString("CONNECTION STRING OMITTED")
                        .UseOuterJoin()
                        .ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle");

                    _sessionFactory = FluentNHibernate.Cfg.Fluently.Configure()
                                        .Database(mysqlConfig)
                                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<User>())
                                        .BuildSessionFactory();

                }

                return _sessionFactory;
            }
        }

        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }
    }

Je reçois cette exception lorsque j'essaie d'exécuter un test dans nunit qui utilise un référentiel utilisant ce mécanisme de session :

NHibernate.MappingException : Pas de persister pour : xxxx.Model.Entities.User

Gracias

P.S. : J'ai essayé d'utiliser les deux et dans AddFromAssemblyOf() ; Le projet avec les définitions de mapping (DataAccess) fait référence au projet avec les entités (Model).

5voto

Anthony Gatlin Points 1370

Quelle version de Fluent NHibernate utilisez-vous ? Il y a eu des problèmes avec les versions release candidate et 1.0. Vous pouvez envisager de télécharger la dernière version depuis le dépôt SVN.

http://fluent-nhibernate.googlecode.com/svn/trunk/

En outre, vous voudrez peut-être vérifier la chaîne de connexion pour vous assurer qu'elle est tout à fait correcte, et vous voudrez vous assurer que "User" ci-dessous pointe vers une classe.

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<User>())

De plus, je dois mentionner que lorsque vous utilisez AddFromAssemblyOf, fluent essaiera de mapper TOUTES les classes de cet assemblage. Si vous avez d'autres classes dans cet espace de noms, vous devrez les filtrer. Il y a plusieurs façons d'y parvenir. La plus simple est de placer tous les POCOs que vous voulez mapper dans leur propre espace de noms et de faire quelque chose comme ce qui suit.

.Mappings(m => m.AutoMappings
                .Add(AutoMap.AssemblyOf<MyNamespace.Entities.MyClass>()
                .Where(type => type.Namespace == "MyNamespace.Entities")

La clause Where permet de filtrer les éléments que vous ne souhaitez pas mettre en correspondance.

4voto

Hannoun Yassir Points 6385

Le fait que mes entités et mes ClassMaps se trouvent dans des assemblages différents pose-t-il un problème ?

Non, il n'y a rien de mal à cela tant que votre projet ClassMap fait référence à votre projet Entities.

Quoi qu'il en soit, essayez ceci :

m.FluentMappings.AddFromAssemblyOf<UserMapping>()

si cela ne fonctionne pas, affichez l'erreur complète

1voto

JohnL Points 181

Le fait d'avoir vos entités dans une assemblée différente ne devrait pas poser de problème, comme Yassir le mentionne ci-dessus.

Selon le Fluent NHibernate Wiki, la méthode AddFromAssemblyOf déduit ou réfléchit sur l'Assemblée qui contient toutes vos entités et les mappera lorsque vous lui fournirez un nom d'entité. D'après la documentation du wiki FNH, vous devriez construire la méthode comme suit :

 m.FluentMappings
  .AddFromAssemblyOf<YourEntity>(); 

Par conséquent, dans votre exemple, si l'entité que vous mettez en correspondance est nommée User, votre code doit être construit comme suit :

 m.FluentMappings
  .AddFromAssemblyOf<User>();

J'espère que cela vous aidera.

1voto

dbones Points 2242

Le problème a-t-il été résolu ? Si non, pourriez-vous inclure votre configuration ?

Par exemple, voici mon premier exemple

public static ISessionFactory GetSessionFactory()
    {
        //Old way, uses HBM files only
        //return (new Configuration()).Configure().BuildSessionFactory(); //requies the XMl file.

        //get database settings.
        Configuration cfg = new Configuration();//.Configure();

        ft = Fluently.Configure(cfg);

        //DbConnection by fluent
        ft.Database
            (
            MsSqlConfiguration
                .MsSql2005
                .ConnectionString(c => c
                   .Server(".\\SqlExpress")
                   .Database("NhibTest")
                   .TrustedConnection()
                )
                .ShowSql()
                .UseReflectionOptimizer()
            );

        //set up the proxy engine
        //cfg.Properties.Add("proxyfactory.factory_class", "NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle");

        //get mapping files.
        ft.Mappings(m =>
             {
                 //set up the mapping locations
                 m.FluentMappings.AddFromAssemblyOf<PersonMap>();//.ExportTo("C:\\mappingfiles");
                 //m.Apply(cfg);
             });

        //return the SessionFactory
        return ft.BuildSessionFactory();
    }

la structure du projet est la suivante

  • project.Data <- fichiers de mapping, et Dao's (également gestionnaire de session hibernate, contenant le code ci-dessus)
  • project.Core <- POCO's
  • projet.UI

ont également regardé aquí Si vous avez un mélange de Fluent NHibernate et de configuration NHibernate

Enfin, jetez un coup d'œil à S#arp Architectures way, car je pense qu'il inclut ce mélange.

NhibernateSession <- fonction : private static ISessionFactory CreateSessionFactoryFor

J'espère que cela vous aidera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X