Я бы хотел, чтобы одна из моих сущностей имела отношения один-к-одному с иерархией классов. Думайте об этом как о шаблоне Стратегии, где каждая стратегия нуждается в различных параметрах для сохранения. Я пытался использовать комбинацию OneToOne
и JoinedBase
/ JoinedKey
, но я столкнулся с проблемой.
При этой комбинации первичный ключ основного объекта также отображается как первичный ключ таблицы, представляющей корневой класс в иерархии, и как первичный ключ подкласса:
Order --------------- TaxCalculator
([PrimaryKey]Id = 1234) ([PrimaryKey(PrimaryKeyType.Foreign)]OrderId = 1234)
^
|
|
UkTaxCalculator
([JoinedKey]UkTaxCalculatorId = 1234)
Я могу сохранить это нормально, но потом я не могу изменить, какой подкласс TaxCalculator
у меня есть. Когда я делаю что-то вроде:
order.TaxCalculator = new OverseasTaxCalculator(order);
затем попытайтесь сбросить, тогда ActiveRecord / NHibernate (понятно) становится недовольным, что теперь есть два TaxCalculators
с Id = 1234
.
Я могу обойти это, заменив OneToOne
на HasMany
/ BelongsTo
и скрыв множественность от пользователей объекта Order
, но мне интересно знать, возможно ли это сделать с OneToOne
.
Полный пример кода на github . Этот код вызывает исключение, когда второй SessionScope
удаляется. Если вы клонируете проект, он должен запускаться «из коробки».