我们最近将我们的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>
任何人都有任何关于如何解决这个问题的线索?谢谢!
答案 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文件夹。