作为NHibernate(2.1.0)的初学者,我正在尝试使用着名的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
来打开会话(我肯定100%确定数据库设置和连接有效)无济于事我只能在这个阶段猜测我的配置不正确,但我不知道如何修复它。
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 :(得分:0)
我对此进行故障排除的第一步是询问您的调用生成了什么sql,然后尝试针对目标数据库运行该数据库并查看获得的结果
您可能需要将appender更改为控制台appender而不是trace。
答案 1 :(得分:0)
您需要在配置对象上调用configure的两件事情如下:
Configuration configuration = new Configuration().Configure();
这需要一个名为Hibernate.cfg.xml的文件位于同一目录中。如果您有其他名称,可以调用另一种方法来指定配置文件的名称。
其次你需要告诉NHibernate在创建工厂之前加载映射文件的位置,哪个程序集
configuration.AddAssembly(typeof(Customer).Assembly); //if in same assembly with customer class
最后,您的客户类的所有成员都应该是虚拟的,否则您将无法使用延迟加载。
答案 2 :(得分:0)
Nailed it!
碰巧我想要智能地玩它并将XML映射文件作为CS文件的依赖项。在这种情况下,嵌入式资源似乎带有CS文件中包含的第一个类的名称,而不是XML文件的名称。一张据说价值千言万语的图片:
所以我写这篇文章是为了让它起作用:
ISessionFactory sessionFactory=new Configuration()
.Configure()
.AddResource(typeof(Customer).FullName, typeof(Customer).Assembly)
.BuildSessionFactory();
让它发挥作用的经验教训:
IDbConnection
打开会话之前,请先打开连接。