当数据实际存在时,使用NHIbernate从Sqlite db中选择不返回任何内容

时间:2011-07-11 16:17:50

标签: c# nhibernate sqlite

我有一个简单的应用程序,在我的数据层使用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文件中没有任何内容,那对我来说没有任何意义。谢谢,

布赖恩

1 个答案:

答案 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>