Обновленные библиотеки DLL NHibernate и FNH — теперь получают исключения «Без сохранения»

#nhibernate #fluent-nhibernate #nhibernate-mapping

#nhibernate #свободно-nhibernate #nhibernate-сопоставление

Вопрос:

Я пытаюсь обновить свой проект автоматического отображения FNH до последних версий NHibernate и Fluent NHibernate (NH 3.2 и FNH 1.3), но теперь я получаю исключение «no persister» для производного класса (хотя базовый класс, похоже, по-прежнему сохраняется должным образом).

Этот производный класс отлично работал со старыми библиотеками DLL (FNH 1.0, NH 2.1.2) — я никак не изменил свою логику отображения или эти классы.

Я обновил свой проект, просто скопировав новые библиотеки DLL поверх старых и удалив ссылки на библиотеки DLL, которые больше не нужны (например, Antlr 3, Castle) в новых библиотеках DLL.

Точные версии, которые я использую:

NHibernate 3.2.0.4000
FluentNHibernate 1.3.0.0
System.Data.SQLite 1.0.76.0
ПО сравнению С 2008 9.0.30729.1 SP
Windows XP SP3 (32 разрядная версия)

Код сопоставления, который работает со старыми библиотеками DLL, но не с новыми:

             return AutoMap.Assemblies(_assemblies)
                // Don't map the abstract base class
                .IgnoreBase<OfeEntity>()

                // Only map subclasses of OfeEntity
                .Where(t => t.IsSubclassOf(typeof(OfeEntity)))

                .Conventions.Add(
                    // Do cascading saves on all entities so lists  will be
                    // automatically saved 
                    DefaultCascade.All(),

                    // Turn on lazy loading, so will only read data that is actually
                    // displayed
                    DefaultLazy.Always()
                );
  

Редактировать:

После включения диагностики FNH я вижу, что FNH не создает таблицу для моего производного класса с новыми библиотеками DLL.

Кроме того, я заметил одну вещь — класс, который не сохраняется, подразделяется на 2 уровня. То есть у меня есть следующие классы:

 public abstract class OfeEntity

public class OfeMeasurementBase : OfeEntity

public class OfeDlsMeasurement : OfeMeasurementBase
  

OfeDlsMeasurement — это класс, который не сохраняется. OfeMeasurementBase, а также несколько других классов, наследуемых от OfeEntity, сохраняются должным образом.

В старых версиях с этим проблем не было — возможно, в новых версиях есть ошибка, когда существует более одного уровня наследования?

Комментарии:

1. Когда возникает это исключение? При создании вашей фабрики сеансов?

2. Получил исключение при попытке выполнить saveOrUpdate.

Ответ №1:

Я перенес наш проект с некоторых старых (F) NH на последнюю версию NH 3.2. Я подозреваю, что теперь он использует разные имена ключевых полей в коллекциях и тому подобное, потому что мне нужно указать точные имена столбцов при использовании существующей базы данных.

Кроме того, я предлагаю восстановить Fluent NHibernate из исходных текстов с помощью NHibernate 3.2, просто чтобы убедиться, что все встанет на свои места.

Ответ №2:

Статья Как обновить ваши приложения до NHibernate 3.2 с помощью Fluent NHibernate 1.2 может быть полезной. Я сам использовал это для обновления проекта, и это сработало.

Комментарии:

1. Спасибо, жаль, что я не нашел эту статью, когда начал это! Один вопрос — действительно ли мне нужно явно устанавливать фабрику прокси по умолчанию? Попробовал это и получил ошибку компиляции «Не удается найти DefaultProxyFactoryFactory».

2. Кажется, это необходимо. В моем проекте я получаю исключение «недопустимая или неполная конфигурация», когда я его исключаю. Я думаю, что Fluent использует NHibernate. Байт-код. Замок по умолчанию, и это больше не входит в 3.2