【问题标题】:The ProxyFactoryFactory was not configured未配置 ProxyFactoryFactory
【发布时间】:2009-07-30 20:21:40
【问题描述】:

我们最近将 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>

有人知道如何解决这个问题吗?谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我的项目中出现了同样的错误,添加对 Nhibernate.ByteCode.Castle.dll 的引用解决了我的问题。
    • 对于那些使用 Castle ActiveRecord 并遇到相同错误的用户,以及添加对 NHibernate.ByteCode.Castle.dll 的引用,您需要将其添加到您的 XML 配置文件中:
    • @Kyralessa。谢谢一百万,我一直在努力让 Castle ActiveRecord 工作,你的评论解决了我遇到的问题!
    【解决方案2】:

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

    成功了。

    【讨论】:

    • 这对我也有用。只是在某个地方放置一个你永远不会调用的方法并创建一个新的 NHibernate.ByteCode.Castle.ProxyFactory()。
    【解决方案3】:

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

    【讨论】:

    • 参考没有“始终复制”选项。但是,Copy Local 设置为 True。
    【解决方案4】:

    似乎设计器以某种方式初始化了您的 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 的东西并尝试解耦。

    【讨论】:

    • NHibernate.ByteCode.Castle.dll(以及其他依赖的dll)已被引用。
    • 我们不是(至少是有意地)尝试在设计模式下使用 NHibernate。只需在设计器中打开一个表单就会触发 VS 2008 尝试初始化与 form_load 函数关联的任何对象(其中一个是 NHibernate)。但是,您提供的代码行看起来是一个可行的选择。我会试一试,然后回复它是如何工作的。
    • 将此视为黑客攻击。我不确定这是否也会阻止在调试模式下创建 SessionFactory。我认为更好的解决方案是重构您的 NHibernateHelper。在 Program.cs 中初始化 SessionFactory 怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2017-11-01
    相关资源
    最近更新 更多