2010-09-13 1 views
1

фонNHibernate медленного запуск, условная загрузка ВСМБ и «Ассоциация ссылка некартированный класс»

У нас есть несколько проектов/приложений, работающих от той же модели. Все они имеют свои уникальные сущности/таблицы, но также разделяют 1 конкретную общую структуру/таблицу. I.e. Объекты, требуемые приложением A, никогда не потребуются приложением B, за исключением общей таблицы, и наоборот. Теперь общая таблица имеет отношения к таблицам приложений А, а также к таблицам приложений В. При загрузке большого количества HBM все происходит довольно медленно, поэтому мы внедрили систему, которая загружает только HBM, необходимые для текущего приложения.

Проблема

В приложении А, когда мы теперь доступ к поваренному/объекту, например:

session.Linq<CommonEntity>().Where (...); 

Мы получаем следующее исключение

NHibernate.MappingException : Ссылка на ассоциацию не присвоен классу: (объект приложения B)

Я надеялся, что NHibernate только сломается, если мы явно попытаемся получить доступ к таблицам приложений B через отношения с общей сущностью, и в результате это не сломается, потому что мы никогда не делаем этого из приложения А. Но увы.

Вопрос

Есть ли способ настроить NHibernate отложить проверку отображения отношений до тех пор, пока не будет доступен?

Мы используем ленивую загрузку.

ответ

2

Конфигурация - это разовая операция, а конфигурация должна быть на 100% совместимой при создании SessionFactory.

Если это все еще слишком медленно для вас, конфигурация может быть сериализована. См. http://github.com/ayende/Effectus/blob/master/Effectus/Infrastructure/BootStrapper.cs

+0

Да, я знаю, что конфигурация является одноразовой операцией, но надеялась, что частичная модель может быть отображена. Однако ваш советник по сериализации является ответом на нашу проблему. Я реализовал сериализацию, а предварительные тесты показывают, что SessionFactory теперь построена на 10-20% от первоначального времени. Thanx! –

1

Я не знаю, как отложить проверку, но я так не думаю.

Однако, возможно, есть еще один вариант. Вы можете попытаться использовать отдельный набор файлов сопоставления для каждого из приложений. Каждый набор содержит только объекты, необходимые для этого приложения, и общую таблицу.

Файл сопоставления для общей таблицы не должен содержать столбцы, которые создают отношения к таблицам, принадлежащим другим приложениям.

Таким образом, каждое приложение имеет свой собственный согласованный набор объектов и просто игнорирует неотображаемые столбцы.

+0

Да, я об этом подумал.Тем не менее, у нас потенциально будет большое количество подключаемых приложений, работающих на одном и том же БД, совместное использование некоторых таблиц, и это станет болью обслуживания, чтобы обновить все отдельные модели при изменении схемы базы данных в общих таблицах. Также мы используем LLBLGen для генерации сущностей и сопоставлений NHibernate и, не очень хорошо знакомых с этим, я не знаю, поддерживает ли он создание нескольких наборов. Это может быть хорошо. –