当数据实际存在时,使用NHIbernate从Sqlite数据库中进行选择不会返回任何结果
本文关键字:选择 行选 结果 任何 返回 数据库 Sqlite 存在 数据 NHIbernate 使用 | 更新日期: 2023-09-27 18:01:50
我有一个简单的应用程序,在我的数据层使用sqlite数据库,没什么大不了的。我已经为UI测试填充了一些记录,但是我根本无法提取数据。
问题是,我的单元测试能够毫无失败地进行CRUD,但我担心的是,当我只是想从表中选择所有记录来填充gridview时,有些事情是不对的。
我在很长一段时间内第一次使用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配置:
<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数据库,我仍然只能看到我的小数据集是在哪里创建的。这些数据保存在哪里?我没有手动管理我的session,我甚至在简单的事情(如select)之后刷新。这些数据到底是从哪里来的?
在这一点上,我将采取一些数据没有,但这对我来说没有意义,如果我正在查看的db文件中没有任何内容。谢谢你,
布莱恩首先,将驱动程序更改为较新版本的驱动程序,SQLiteDriver适用于旧的finstar驱动程序,并且它与较新版本的SQL Lite有一些奇怪之处。此外,如果需要更改数据库路径,则不能引用带有空格的路径而不在其周围加上"。如果将数据库放在与可执行文件相同的目录中,则只需使用db名称即可。这个配置非常适合我:
<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>