2009-10-29 2 views
4

J'ai une solution qui utilise NHibernate pour générer le schéma db basé sur les fichiers de mappage. J'essaye de casser cette fonctionnalité hors de la solution ainsi elle peut être employée comme application de console autonome. Je suis en mesure de fournir un chemin vers les fichiers de mappage comme ceci:Nécessité de fournir une configuration nhibernate un chemin à un assembly

 NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration(); 

     /**/ 
     Assembly contractsAssembly = Assembly.LoadFrom(@"C:\Data\Development\NHibernateTestMappings\Source\DomainModel\Core\bin\Debug\NHibernateTestMappings.Core.Contracts.dll"); 
     Assembly assembly = Assembly.LoadFrom(@"C:\Data\Development\NHibernateTestMappings\Source\DomainModel\Core\bin\Debug\NHibernateTestMappings.Core.dll"); 
     cfg.AddAssembly(contractsAssembly); 
     cfg.AddAssembly(assembly); 
     /**/ 


     DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Data\Development\NHibernateTestMappings\Source\DomainModel\Core\Mappings"); 
     FileInfo[] mappingfiles = directoryInfo.GetFiles("*.hbm.xml"); 
     foreach (FileInfo fi in mappingfiles) 
     { 
      cfg.AddFile(fi.FullName); 
      //cfg.Configure(myAssembly, fi.FullName);     
      //cfg.AddResource(fi.FullName, myAssembly); 
     } 

Alors, quand il arrive au point où il tente d'ajouter le fichier, il se plaint qu'il ne peut pas trouver l'ensemble NHibernateTestMappings.Core parce qu'il aucune référence à l'ensemble dans mon application autonome, mais chaque fichier de mappage contient une référence à l'assemblée:

<class name="NHibernateTestMappings.Core.Store, NHibernateTestMappings.Core" table="STORE" lazy="false"> 

Ce que je besoin est un moyen de fournir la configuration NHibernate un chemin de fichier à la dll de mon assemblée plutôt que d'ajouter une référence pour que je puisse juste échanger des chemins dans un app.config et que ceci génère mon schéma.

Répondre

3

Ok, j'ai cela fonctionne maintenant, mais j'ai peut-être découvert un bug dans nhibernate. Voici le code de NHibernate.cfg.Configuration.AddAssembly:

public Configuration AddAssembly(string assemblyName) 
{ 
     log.Info("searching for mapped documents in assembly: " + assemblyName); 
     Assembly assembly = null; 
     try 
     { 
      assembly = Assembly.Load(assemblyName); 
     } 
     catch(Exception e) 
     { 
      log.Error("Could not configure datastore from assembly", e); 
      throw new MappingException("Could not add assembly named: " + assemblyName, e); 
     } 
     return this.AddAssembly(assembly); 
} 

Alors Assembly.Load (assemblyName) ne se soucie pas que je suis assez gentil pour aller trouver le chemin, il prend juste le nom et essaie de regarder pour ça. Puisque cette DLL n'est pas dans le même répertoire que l'application, elle ne peut pas le trouver. Ma solution actuelle sera de sortir et de récupérer les DLL et de les déplacer dans mon répertoire d'application, puis de les supprimer après la génération du schéma. Si quelqu'un a d'autres suggestions, je suis ouvert à eux.

1

Avez-vous essayé ceci:?

var myAssembly = System.Reflection.Assembly.LoadFrom(path); 
+0

Oui, essayé diverses choses après avoir posté cela, mais cela n'a pas fonctionné. J'ai mis à jour mon code pour montrer ma dernière version. J'ai aussi essayé des trucs sur l'appdomain, mais ça a échoué parce qu'il n'y a pas de point d'entrée par défaut car mon noyau est un dll et non un exe. –

+0

C'est pourquoi je vous recommande d'utiliser le code ci-dessus. Ensuite, vous appelez: cfg.AddAssembly (muAssembly); Au lieu de la surcharge qui prend une chaîne, vous utilisez cette charge: public AddAssembly de configuration (Assembly) Qui accepte un objet "Assembly" directement, et vous décidez comment obtenir cet assembly pour cela. Avoir une bibliothèque de classe sans point d'entrée ne devrait pas poser de problème du tout. – Meligy

Questions connexes