当数据实际存在时,使用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文件中没有任何内容。谢谢你,

布莱恩

当数据实际存在时,使用NHIbernate从Sqlite数据库中进行选择不会返回任何结果

首先,将驱动程序更改为较新版本的驱动程序,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>