Изменение подтипов в NHibernate - PullRequest
0 голосов
/ 11 ноября 2009

Я уже прочитал NHibernate - Изменение подтипов , и я не нахожу это удовлетворительным для моей ситуации.

Моя система позволяет пользователям планировать работу. Расписания могут быть настроены с различными типами критериев расписания (Только один раз, Ежедневно, Еженедельно, Ежемесячно по дням месяца и Ежемесячно по неделям месяца). У каждого из них очень разные данные и поведение. Абсолютно правильно для пользователя изменить расписание с одного типа критериев на другой.

Я попытался сделать эту работу, взяв идентификатор расписания, который был сохранен ранее, создав новый экземпляр расписания с новым типом, установив идентификатор и сохранив. Все данные были обновлены, как и ожидалось, за исключением, конечно, дискриминатора.

Изменение моей модели было бы абсолютным последним средством.

На данный момент я пытаюсь сохранить новые критерии (с новым идентификатором) и обновить ссылки на них, а затем удалить старые критерии.

У кого-нибудь есть идея получше?

Ответы [ 3 ]

0 голосов
/ 12 ноября 2009

Поскольку вы уже сгибаете представление NHibernate для идентификации объекта, почему бы вам просто не обновить его за пределами NHib с помощью некоторого пользовательского SQL?

Мое предпочтительное решение - обновить мою модель, но вы сказали, что это последнее средство для вас.

0 голосов
/ 12 ноября 2009

Если вы хотите использовать NHibernate, вы должны сделать следующее:

Написать объектно-ориентированный код.

Если ваш конкретный случай труден для выражения объектно-ориентированным способом, то вам не следует использовать NHibernate для этого случая.

Для вашего случая вы должны:

  • создайте новый экземпляр класса, производного Schedule, и разрешите ему иметь новый ID
  • скопировать соответствующие свойства из старого Schedule экземпляра
  • удалите старый экземпляр Schedule из Session и убедитесь, что рассматриваемый экземпляр Job не ссылается на него
  • добавьте новый экземпляр Schedule к Session и убедитесь, что рассматриваемый экземпляр Job ссылается на него

На уровне базы данных это будет delete и insert, а не update.

Это не последнее средство. Это должен был быть ваш первый курорт. Это правильный способ сделать это с объектно-ориентированной точки зрения.

0 голосов
/ 11 ноября 2009

Вы пытались изменить отображение дисминатора, чтобы добавить force = true, как в следующем элементе hbm.xml

<discriminator column="DiscriminatorColumnName" force="true" />

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...