Выбор из Sqlite db с помощью NHIbernate ничего не возвращает, когда данные действительно присутствуют - PullRequest
0 голосов
/ 11 июля 2011

У меня есть простое приложение, которое использует sqlite db в моем слое данных, ничего особенного. Я заполнил несколько записей для тестирования пользовательского интерфейса, но я не могу вернуть данные вообще.

Дело в том, что мои мои модульные тесты способны CRUD в обязательном порядке, но я обеспокоен тем, что что-то не так, когда я просто хочу выбрать все записи из таблицы, например, для заполнения сетки.

Впервые за долгое время я использую 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% способны вставлять и считывать данные. Я что-то упускаю и не могу понять, что.

EDIT Я также столкнулся с исключением из-за ленивых загрузок в отношениях «один ко многим». Я сделал столбцы коллекции lazy = "false", которые устранили ошибку. Побочным эффектом является то, что теперь я возвращаю данные везде, но это данные модульного тестирования откуда-то, и когда я открываю базу данных sqlite, я все еще вижу только, где был создан мой маленький набор данных. Где хранятся эти данные? Я не управляю своей ISession вручную, и я даже очищаюсь от простых вещей, таких как выбор. Откуда же эти данные?

В этот момент я возьму некоторые данные поверх одного, но для меня нет смысла, если в файле db, на который я смотрю, ничего нет. Спасибо,

Bryan

1 Ответ

0 голосов
/ 27 июля 2011

Прежде всего, измените Driver на более новую версию драйвера, 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...