#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