未配置ProxyFactoryFactory

时间:2009-07-30 20:21:40

标签: c# winforms visual-studio-2008 nhibernate proxyfactory

我们最近将我们的Windows窗体C#项目从NHibernate 2.0升级到2.1。我们更新了app.config以包含“proxyfactory.factory_class”以指向所选代理(在我们的例子中为“NHibernate.ByteCode.Castle”)。升级后,程序按预期构建和运行,没有任何问题。我们的问题是在Visual Studio 2008设计器中加载时尝试打开任何引用了NHibernate的表单时,现在给出了以下错误(好像我们没有配置代理):

  

ProxyFactoryFactory不是   配置。初始化   'proxyfactory.factory_class'财产   会话工厂配置   有一个可用的部分   NHibernate.ByteCode提供程序。

堆栈追踪:

   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

来自NHibernateHelper的第62行:

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

以下是我们对NHibernate的app.config配置:

<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>

任何人都有任何关于如何解决这个问题的线索?谢谢!

4 个答案:

答案 0 :(得分:3)

我刚刚解决了同样的错误。

我的数据访问程序集有一个对Nhibernate.ByteCode.Castle.Dll的正确引用,它出现在它的bin / release文件夹中。在数据访问程序集中一切正常。

当我尝试使用测试程序集中的数据访问代码时,抛出了错误。事实证明,即使我的测试程序集引用了数据访问项目,它也没有获得Nhibernate.ByteCode.Castle.dll的副本。在测试程序集中添加对Nhibernate.ByteCode.Castle.dll的引用解决了这个问题。

答案 1 :(得分:1)

我遇到了同样的问题。要修复它,我不仅要显式引用DLL,还要向显式创建NHibernate.ByteCode.Castle.ProxyFactoryFactory的测试DLL添加一个方法。

这就是诀窍。

答案 2 :(得分:0)

似乎Designer以某种方式初始化了SessionFactory。您是否尝试将ByteCodeProvider dll添加为项目的参考?

[编辑] 好的......,部署应用程序时运行的事实意味着所有内容都已正确配置。所以你的问题是VS DesignMode问题。为什么(哎呀)你在设计模式中使用NHibernate? 如果你真的需要它,请尝试在代码中设置ByteCodeProvider。如果您不需要它并且只是想快速处理,您可以使用此Hack检查当前的VS模式,防止Nhibernate构建SessionFactory:

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

如果我是你,我会尝试找到控件或任何需要这个静态NHibernateHelper并尝试解耦的东西。

答案 3 :(得分:0)

确保在Nhibernate.ByteCode.Castle引用的属性中,将其设置为“始终复制”,以便将其复制到\ bin文件夹。