2009-07-30 21 views
4

我們最近將我們的窗體C#項目從NHibernate 2.0升級到2.1。我們更新了我們的app.config以包含「proxyfactory.factory_class」以指向所選的代理(在我們的例子中爲「NHibernate.ByteCode.Castle」)。升級後,程序按預期構建並運行,沒有問題。我們的問題是試圖打開時在Visual Studio 2008設計器中加載具有參考NHibernate的任何形式的時候,現在給我們以下錯誤(因爲如果我們沒有配置的代理):ProxyFactoryFactory未配置

的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 

62號線從NHibernateHelper:

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

看來,設計器以某種方式初始化您的SessionFactory。您是否嘗試將ByteCodeProvider dll作爲參考添加到您的項目中?

[編輯] 好的,應用程序在部署時運行的事實意味着一切都正確配置。所以你的問題是一個VS DesignMode問題。爲什麼(heck)你在設計模式中使用NHibernate? 如果您確實需要它,請嘗試在您的代碼中設置ByteCodeProvider。如果你不需要它,只是想快速workarround你可以查看當前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並試圖解耦。

+0

NHibernate.ByteCode.Castle.dll(以及其他依賴dll)已被引用。 – 2009-07-31 08:25:55

+0

我們沒有(至少有意)嘗試在設計模式下使用NHibernate。只需在設計器中打開一個表單就可以觸發VS 2008,嘗試初始化與form_load函數(其中之一是NHibernate)關聯的任何對象。您提供的代碼行看起來像是一個可行的選項。我會給出一個答案,並發表如何工作的答覆。 – 2009-07-31 20:34:38

+0

將此視爲黑客。我不確定這是否也會阻止在調試模式下創建SessionFactory。我認爲更好的解決方案是重構你的NHibernateHelper。在Program.cs中初始化SessionFactory怎麼樣? – zoidbeck 2009-07-31 21:20:47

0

確保在Nhibernate.ByteCode.Castle引用的屬性中將其設置爲「始終複製」,以便將其複製到\ bin文件夾中。

+0

參考中沒有「始終複製」選項。但是,「複製本地」設置爲「真」。 – 2009-07-31 08:25:07

3

我剛剛解決了同樣的錯誤。

我的數據訪問程序集對Nhibernate.ByteCode.Castle.Dll有適當的引用,它出現在它的bin/release文件夾中。在數據訪問程序集內一切正常。

當我嘗試使用我的測試程序集中的數據訪問代碼時,拋出了錯誤。事實證明,即使我的測試程序集引用了數據訪問項目,它也沒有得到Nhibernate.ByteCode.Castle.dll的副本。在測試程序集中添加對Nhibernate.ByteCode.Castle.dll的引用解決了這個問題。

+0

我在我的項目中有同樣的錯誤,添加對Nhibernate.ByteCode.Castle.dll的引用解決了我的問題。 – nandin 2009-10-27 15:43:10

+5

對於那些使用Castle ActiveRecord並獲取相同錯誤的人,以及將引用添加到NHibernate.ByteCode.Castle.dll中,您需要將其添加到XML配置文件中: 2009-11-19 02:48:57

+1

@Kyralessa。萬分感謝,我一直在努力讓Castle ActiveRecord工作,並且您的評論解決了我遇到的問題! – RichardOD 2010-06-29 10:52:45

1

我有同樣的問題。爲了解決這個問題,我不僅需要明確地引用DLL,而且還要向顯式創建NHibernate.ByteCode.Castle.ProxyFactoryFactory的測試DLL添加一個方法。

這樣做。

+1

這也適用於我。只是在某處放置了一個永遠不會調用的方法,並創建一個新的NHibernate.ByteCode.Castle.ProxyFactory()。 – 2011-10-27 21:23:39