我有一个简单的应用程序,在我的数据层使用sqlite db,没什么大不了的。我已经填充了一些用于UI测试的记录,但我根本无法提取数据。
问题是我的单元测试能够毫无问题地进行CRUD,但我担心当我只想从表格中选择所有记录来填充gridview时,某些东西是不对的。
我在loooooong时间第一次使用NHibernate所以我无法判断这是否存在设置问题。
基地选择方法:
protected IList<T> SelectMultipleInternalALL()
{
// create session and select.
using (ISession session = NBHelper.OpenSession())
return session.CreateCriteria<T>().List<T>();
}
助手类:
public class NBHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var configuration = new Configuration();
configuration.Configure();
configuration.AddAssembly(Assembly.GetCallingAssembly());
new SchemaExport(configuration).Execute(false, true, false);
_sessionFactory = configuration.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
表格配置:
<class name="UserData" table="User">
<id name="Id" type="System.Int32" column="Id" >
<generator class="native"/>
</id>
<property name="Email" />
<property name="FirstName" />
<property name="LastName" />
<property name="Notes" />
<property name="Favorite" type="boolean" />
<bag name="Addresses" inverse="true" cascade="all" generic="true">
<key column="UserId" />
<one-to-many class="AddressData"/>
</bag>
<bag name="Tags" inverse="true" cascade="all" generic="true">
<key column="WhatId" />
<one-to-many class="TagData"/>
</bag>
NHibernate config:
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SQLiteDriver</property>
<property name="connection.connection_string">
Data Source=C:\Documents and Settings\bryang\Desktop\AddressBook\AddressBook.DAL\addressbook.s3db
</property>
<property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
<property name="query.substitutions">true=1;false=0</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name="show_sql">true</property>
数据库位置完全有效,但我没有记录。我认为问题可能出在CreateCriteria()调用中,但我的单元测试是100%能够插入和读回数据。我错过了什么,我无法弄清楚是什么。
修改 我也遇到了一对多关系中的延迟加载异常。我使收集列lazy =“false”清除了错误。副作用是现在我在任何地方返回数据,但它是来自某个地方的单元测试数据,当我打开sqlite数据库时,我仍然只看到我的小数据集创建的位置。这些数据保存在哪里?我不是手动管理我的ISession,而是在简单的选择之后我甚至都在冲洗。这些数据究竟来自哪里?
此时我将获取一些数据,但是如果我正在查看的db文件中没有任何内容,那对我来说没有任何意义。谢谢,
布赖恩
答案 0 :(得分:0)
首先,将驱动程序更改为较新版本的驱动程序,SQLiteDriver适用于旧的finstar驱动程序,并且它与较新版本的SQL Lite有一些怪癖。此外,您的数据库路径需要更改,您不能引用带空格的路径而不会放置它。如果您将数据库放在与可执行文件相同的目录中,则只需使用数据库名称。此配置对我很有用:
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
<property name="connection.connection_string">Data Source=core.db3;Version=3</property>
<property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
<property name="query.substitutions">true=1;false=0</property>
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name="show_sql">true</property>