2009-07-30 5 views
4

Nous avons récemment mis à niveau notre projet Windows Forms C# de NHibernate 2.0 à 2.1. Nous avons mis à jour notre app.config pour inclure le "proxyfactory.factory_class" pour désigner le proxy choisi ("NHibernate.ByteCode.Castle" dans notre cas). Après la mise à niveau, le programme se construit et s'exécute comme prévu, sans problème. Notre problème est en essayant d'ouvrir toutes les formes qui ont des références à NHibernate à charge dans le Visual Studio 2008 concepteur, nous donne maintenant l'erreur suivante (comme si nous avions pas configuré le proxy):La ProxyFactoryFactory n'a pas été configurée

Le ProxyFactoryFactory était pas configuré. Initialiser propriété 'proxyfactory.factory_class' de la configuration session-usine avec l'un des fournisseurs NHibernate.ByteCode disponibles.

Trace de la pile:

at NHibernate.Bytecode.AbstractBytecodeProvider.get_ProxyFactoryFactory() 
    at NHibernate.Cfg.Configuration.Validate() 
    at NHibernate.Cfg.Configuration.BuildSessionFactory() 
    at DAL.NHibernateHelper..cctor() in ...\DAL\NHibernateHelper.cs:line 62 

Ligne 62 de NHibernateHelper:

static NHibernateHelper() 
    { 
     var cfg = new Configuration(); 
     cfg.Configure(); 
     cfg.AddAssembly("DAL"); 
     sessionFactory = cfg.BuildSessionFactory(); // <-- line 62 
    } 

Voici notre configuration app.config pour NHibernate:

<configuration> 
    <configSections> 
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> 
    </configSections> 
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> 
     <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> 
     <property name="connection.connection_string">Server=ourserver;initial catalog=ourdb;Integrated Security=SSPI</property> 
     <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> 
     <property name="show_sql">true</property> 
    </session-factory> 
    </hibernate-configuration> 
</configuration> 

quelqu'un a des indices sur comment remédier à ce problème? Merci!

Répondre

0

Il semble que le concepteur initialise en quelque sorte votre SessionFactory. Avez-vous essayé d'ajouter la DLL ByteCodeProvider comme référence à votre projet? Ok ..., le fait que l'application s'exécute quand elle est déployée implique que tout est configuré correctement. Votre problème est donc un problème VS DesignMode. Pourquoi (le diable) utilisez-vous NHibernate dans designmode? Si vous en avez vraiment besoin, essayez de définir le ByteCodeProvider dans votre code. Si vous ne avez pas besoin et que vous voulez juste un workarround rapide, vous pouvez vérifier le mode VS avec ce hack empêchant Nhibernate de construire la SessionFactory:

static NHibernateHelper() 
{ 
    if(System.Diagnostics.Process.GetCurrentProcess().ProcessName != "devenv") 
    { 
     var cfg = new Configuration(); 
     cfg.Configure(); 
     cfg.AddAssembly("DAL"); 
     sessionFactory = cfg.BuildSessionFactory(); // <-- line 62 
    } 
} 

Si je devais vous, je vais essayer de trouver le contrôle ou tout ce qui a besoin de cette static NHibernateHelper et essayez de découpler.

+0

NHibernate.ByteCode.Castle.dll (ainsi que d'autres DLLs dépendantes) ont été référencés. –

+0

Nous n'essayons pas (du moins intentionnellement) d'utiliser NHibernate en mode conception. Ouvrir simplement un formulaire dans le concepteur déclenche VS 2008 pour essayer d'initialiser tous les objets associés à la fonction form_load (dont NHibernate). La ligne de code que vous avez fournie ressemble toutefois à une option viable. Je vais donner un coup de feu et poster une réponse sur comment cela a fonctionné. –

+0

Considérez ceci comme un Hack. Je ne suis pas sûr que cela bloquerait également la création de SessionFactory en mode Debug. Je pense qu'une meilleure solution serait de refactoriser votre NHibernateHelper. Qu'en est-il de l'initialisation de SessionFactory dans Program.cs? – zoidbeck

0

Assurez-vous que dans les propriétés de votre référence Nhibernate.ByteCode.Castle, définissez-le sur "Copy Always" afin qu'il soit copié dans votre dossier \ bin.

+0

Il n'y a pas d'option "Copier Toujours" pour la référence. Cependant, Copy Local est défini sur True. –

3

Je viens d'élaborer la même erreur.

Mon assembly d'accès aux données avait une référence appropriée à Nhibernate.ByteCode.Castle.Dll et il est apparu dans son dossier bin/release. Tout a bien fonctionné dans l'ensemble d'accès aux données.

L'erreur s'est produite lorsque j'ai essayé d'utiliser le code d'accès aux données de mon ensemble de test. Il s'est avéré que même si mon assembly de test référencé le projet d'accès aux données, il n'a pas obtenu une copie de Nhibernate.ByteCode.Castle.dll. L'ajout d'une référence à Nhibernate.ByteCode.Castle.dll dans l'ensemble de test a résolu le problème.

+0

J'ai eu la même erreur dans mon projet, en ajoutant une référence à Nhibernate.ByteCode.Castle.dll résolu mon problème. – nandin

+5

Pour ceux qui utilisent Castle ActiveRecord et qui reçoivent la même erreur, ainsi que l'ajout de la référence à NHibernate.ByteCode.Castle.dll, vous devrez ajouter ceci à votre fichier de configuration XML:

+1

@Kyralessa. Merci un million, j'ai essayé de faire fonctionner Castle ActiveRecord, et vous avez corrigé le problème que j'avais! – RichardOD

1

J'ai eu le même problème. Pour le résoudre, je devais non seulement référencer explicitement la DLL, mais ajouter une méthode à la DLL de test qui créait explicitement NHibernate.ByteCode.Castle.ProxyFactoryFactory.

Cela a fait l'affaire.

+1

Cela a fonctionné pour moi aussi. Mettez quelque part une méthode que vous n'appelerez jamais et créez une nouvelle NHibernate.ByteCode.Castle.ProxyFactory(). –

Questions connexes