NHibernate — одна таблица на иерархию классов — классы наследования неизвестны

В моей модели все производные классы имеют те же **постоянные** атрибуты и методы, что и базовый абстрактный класс. Есть некоторые специфичные для класса атрибуты, которые не сохраняются, а методы имеют другую реализацию. Прямо сейчас у меня есть около 4 классов наследования, и я добавлю больше в будущем. Суть приложения в том, что такие классы могут быть добавлены для разных целей, поэтому их невозможно узнать заранее. Единственное условие состоит в том, что все они будут использовать одни и те же методы и постоянные атрибуты. Это один столбец, который будет использоваться в качестве дискриминатора.

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

Я не думаю, что у меня есть лучший вариант?


person Yoav    schedule 28.01.2011    source источник


Ответы (1)


Ваш подход имеет недостатки в том, что уровень сохраняемости не может не знать о подклассах, потому что ему нужно знать, что такое класс при загрузке/сохранении.

Что вы можете сделать, так это использовать сопоставление на основе соглашения вместо явного (у Fluent есть автоматическое сопоставление, а ConfORM основано только на соглашении/переопределении), поэтому вам не нужно писать каждую карту классов.

В ConfORM достаточно сказать, например, orm.TablePerClass<TheBaseClass>(), затем mapper.CompileMappingFor(TheBaseClassAndAllItsSubclasses), и вы получите сопоставления без дополнительных усилий.

person Diego Mijelshon    schedule 29.01.2011
comment
Спасибо. Хотя это не тот ответ, который я хотел получить, он прояснил мою ошибку. Даже если я каким-то образом смогу заставить NHibernate сохранить неизвестный класс, он никак не сможет загрузить неизвестный класс. Поскольку для меня важно иметь своего рода «подключаемую» среду, я буду держать NHibernate в неведении о подклассах, и каждый из подклассов отправит версию своего базового класса в NHibernate. - person Yoav; 29.01.2011