2009-09-23 142 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