LINUX.ORG.RU

Проблемы с извлечением данных в NHibernate


0

2

Всем привет. Итак, что имеется в наличии: учебная БД, поднятая на локальном сервере PostgreSQL версии 9.0, она пока что состоит из одной таблицы (Book).

Вот структура таблицы Book: http://pastebin.ubuntu.com/744970

Класс сущности Book: http://pastebin.ubuntu.com/744973/

Файл маппинга Book: http://pastebin.com/se5hSwGb

Тестовый код: http://pastebin.com/fJuK1Sdm

В итоге, при запуске в отладчике соединение с базой проходит без ошибок, но свойство Count переменной bookList равно 0 при том, что тестовые записи в этой таблице точно есть: заранее заносил их.

Что тут может быть не так? Всем спасибо.

В тред кастуется shty и все дотнетчики.

LongLiveUbuntu ★★★★★
() автор топика

Пардон за оффтоп. А в NHibernate так и не прикрутили аннотации для мэппинга? Так и приходится, по старинке, дедовскими способами xml-конфиги клепать?

Nagwal ★★★★
()

УМВР, проверял на MsSql. Заменил:

var nhConfig = new Configuration().Configure();
            var sessionFactory = nhConfig.BuildSessionFactory();
            Console.WriteLine("Configured!");
на
var nhConfig = new Configuration().Configure();
            nhConfig.AddAssembly("Eg.Core");
            var sessionFactory = nhConfig.BuildSessionFactory();
            new SchemaExport(nhConfig).Execute(false, true, false);
            Console.WriteLine("Configured!");

Плюс, код отказался компилироваться с приватным сеттером на id, для mssql заменил sequence на identity.

encyrtid ★★★★★
()
Ответ на: комментарий от Nagwal

Прикрутили. Можно с помощью лямбд конфигурировать сущности, например, так:

class BookMap : ClassMap<Book>
{
	public BookMap()
	{
		Id(b => b.Id).GeneratedBy.Sequence("Book_Id_seq");
		Map(m => m.Name).Not.Nullable();
		Map(m => m.Description).Not.Nullable();
		Map(m => m.Price).Not.Nullable();
		Map(m => m.Author);
		Map(m => m.Isbn).Column("ISBN");
	}
}

Называется FluentNHibernate.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Пардон, эти строчки нужно поменять местами:

var sessionFactory = nhConfig.BuildSessionFactory();
new SchemaExport(nhConfig).Execute(false, true, false);

encyrtid ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Постгресса под рукой нет, могу проверить только вечером.

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

Заметил во время отладки, что свойство ClassMappings переменной nhConfig также установлено в 0. Похоже здесь и зарыта собака.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Заметил во время отладки, что свойство ClassMappings переменной nhConfig также установлено в 0

После AddAssembly() должно меняться.

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

Не меняется. Там относительный же путь к файлу пишется? Скорее всего, да.

Сейчас посмотрю, где находится Eg.Core.dll

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Имя Eg.Core я взял из файла маппинга, в AddAssembly() должно передавать имя сборки в которой находится определение файлов сущностей.

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

Все на месте. xml-файл с маппингом имеет атрибут «внедренный ресурс».

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от encyrtid

И поставь заодно, чтоб проект Eg.Core пересобирался при каждом перестроении, а то отлаживать будет трудно.

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

Пересобрал, теперь MappingsCount = 1. Но Count в bookList по-прежнему равно 0. В отладочную консоль выводится что-то типа «NHibernate: SELECT this.Id as Id0_0_, this.Name as Name0_0_...» и так далее.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Заработало таки на Postgres. При следующих изменениях:

- переименован маппинг Book.nbm.xml в Book.hbm.xml;

- generator class=«sequence» вместо identity (это работает только в mssql);

- тип свойства Price заменен на Decimal, с Currency вылетали эксепшены на дробных значениях;

- в hibernate.cfg.xml удалена строчка mapping assembly=«Eg.Core» (вызывает эксепшен при маппинге);

- закомментируй строчку: new SchemaExport(nhConfig).Execute(false, true, false), она нужна только если меняется какое-то свойство таблицы, она затирает все имеющиеся записи в таблице.

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

Хорошо, позже спишемся.

Пока что в строке IEnumerable<Book> bookList = openSession.QueryOver<Book>().List<Book>() выкидывается GenericADOException

Тип Currency исправил на Decimal.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от encyrtid

Есть:

could not execute query [ SELECT this_.Id as Id0_0_, this_.Name as Name0_0_, this_.Description as Descript3_0_0_, this_.Price as Price0_0_, this_.Author as Author0_0_, this_.ISBN as ISBN0_0_ FROM Book this_ ] [SQL: SELECT this_.Id as Id0_0_, this_.Name as Name0_0_, this_.Description as Descript3_0_0_, this_.Price as Price0_0_, this_.Author as Author0_0_, this_.ISBN as ISBN0_0_ FROM Book this_]

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Может с провайдером проблема? Я использовал

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
в hibernate.cfg.xml

encyrtid ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.