2009-09-23 139 views
0

作爲NHibernate(2.1.0)的初學者,我試圖用着名的Northwind數據庫設置我的第一個單元測試。該測試是這樣的(配置文件可以在這個問題的末尾找到):用NHibernate映射Northwind客戶的問題

ISessionFactory sessionFactory=new Configuration().BuildSessionFactory(); 
ISession session=sessionFactory.OpenSession(); 
IList<Customer> list=session.CreateCriteria<Customer>().List<Customer>(); 
Assert.AreEqual(91, list.Count); 

的問題是,list.Count始終爲0

  • 我曾嘗試打開會話提供它我自己IDbConnection,在Sql Server 2008,MS Access和SQLite(我肯定100%確定數據庫設置和連接是有效的)無濟於事。
  • 我試圖讓生成的SQL顯示在VS2008輸出窗口上(請參閱本文後面的配置文件),但沒有任何顯示。

我只能猜測在這個階段我的配置是不正確的,但我不知道如何解決它。


  • 的App.config

    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
        <session-factory> 
        <property name="dialect">NHibernate.Dialect.SQLiteDialect</property> 
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
        <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property> 
        <property name="connection.connection_string">Data Source=S:\Work\SVN\src\Northwind\SQL\Northwind.db</property> 
        <property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> 
        <property name="show_sql">true</property> 
        </session-factory> 
    </hibernate-configuration> 
    <log4net> 
        <appender name="DebugSQL" type="log4net.Appender.TraceAppender"> 
        <layout type="log4net.Layout.PatternLayout"> 
         <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
        </layout> 
        </appender> 
        <root> 
        <level value="DEBUG" /> 
        <appender-ref ref="DebugSQL" /> 
        </root> 
    </log4net> 
    
  • Customer.cs

    namespace Northwind.DomainModel.NHibernate 
    { 
        public class Customer 
        { 
         public string CustomerID { get; set; } 
         public string CompanyName { get; set; } 
         public string ContactName { get; set; } 
         public string ContactTitle { get; set; } 
         public string Address { get; set; } 
         public string City { get; set; } 
         public string Region { get; set; } 
         public string PostalCode { get; set; } 
         public string Country { get; set; } 
         public string Phone { get; set; } 
         public string Fax { get; set; } 
        } 
    } 
    
  • Customer.hbm.xml

    <hibernate-mapping 
        xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Northwind.DomainModel" 
        namespace="Northwind.DomainModel.NHibernate" 
    > 
        <class name="Customer" table="Customers"> 
        <id name="CustomerID" column="CustomerID" type="String" length="5"> 
         <generator class="assigned" /> 
        </id> 
        <property name="CompanyName" /> 
        <property name="ContactName" /> 
        <property name="ContactTitle" /> 
        <property name="Address" /> 
        <property name="City" /> 
        <property name="Region" /> 
        <property name="PostalCode" /> 
        <property name="Country" /> 
        <property name="Phone" /> 
        <property name="Fax" /> 
        </class> 
    </hibernate-mapping> 
    
+0

客戶ID時的長度是5,而不是20。這是不太可能但解決您的問題。 – 2009-09-23 08:29:45

+0

感謝您指出:從我發現的一些博客愚蠢的複製和粘貼。但這意味着你閱讀整件事情! – Mac 2009-09-23 12:09:09

回答

0

釘住它!

發生這種情況我想玩它聰明,並有XML映射文件作爲CS文件的依賴。在這種情況下,嵌入式資源似乎具有包含在CS文件中的第一個類的名稱,而不是XML文件的名稱。圖像是理應勝過千言萬語: Solution and Assembly

所以我寫這得到它的工作:

  • 的NHibernate不會抱怨:

    ISessionFactory sessionFactory=new Configuration() 
        .Configure() 
        .AddResource(typeof(Customer).FullName, typeof(Customer).Assembly) 
        .BuildSessionFactory(); 
    

    教訓得到它的工作教訓在任何情況下當您嘗試使用沒有已知映射的類時。我不確定我會稱之爲一項功能...

  • 在與您自己的IDbConnection開啓會話之前,請打開連接本身。
  • 你學習比你打算嘗試打得更聰明;-)
+0

備註:我仍然無法在輸出中看到任何SQL ... – Mac 2009-09-23 13:07:09

0

我的第一步,故障排除,這將是要問的是被你的電話產生哪些SQL,然後嘗試運行,對目標數據庫看看你會得到什麼樣的結果

你可能需要改變你的appender到控制檯appender而不是跟蹤。你需要調用配置配置對象在這樣

0

兩件事情:

 
Configuration configuration = new Configuration().Configure(); 

本指望在同一個目錄中名爲hibernate.cfg.xml文件。如果您有其他名稱,您可以調用另一種方法來指定配置文件的名稱。

其次,你需要告訴NHibernate的地方建立工廠

 

configuration.AddAssembly(typeof(Customer).Assembly); //if in same assembly with customer class 

最後你的客戶類的所有成員都應該是虛擬否則你無法使用延遲加載之前的映射文件,它集加載。

+0

感謝您的回答。我的配置位於App.config中,我可以告訴它正確加載,因爲由於我必須修復的許多錯誤而引發的所有異常;-)而第二點並不能解決問題。 – Mac 2009-09-23 10:24:10