2009-11-10 4 views
0

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

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

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

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

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

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

ответ

0

Вы пробовали ваше отображение необходимости модифицировать disciminator, чтобы добавить силу = TRUE как следующий hbm.xml элемент

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

+0

Хм ... Я бы хотел попробовать, но у меня проблемы с отображениями дискриминаторов в Fluent-NHibernate. – Will

0

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

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

+0

Из любопытства, как бы вы предложили обновить модель? – Will

+0

Выбор 1: создать новый объект расписания правильного типа и ввести задание в новое расписание (т. Е. Получит новое значение PK). Выбор 2: создать объект «супер-график», который может запускаться в любое или все ежедневное, еженедельное, ежемесячное и т. Д. В IOW нет класса DailySchedule или класса WeeklySchedule. Затем изменение расписания становится вопросом обновления соответствующих бит на этом объекте, вместо того, чтобы пытаться изменить тип объекта. –

0

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

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

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

В вашем случае, вы должны:

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

Это в конечном итоге, на уровне базы данных, как delete и insert, а не update.

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

+0

По сути, это то, что я делаю: * создавать новые ScheduleCriteria и заполнить его из пользовательского интерфейса * определить идентификатор старого ScheduleCriteria * сохранить расписание с его новым ScheduleCriteria * удалить старый ScheduleCriteria по идентификатору – Will

+0

К Кстати, что заставляет вас думать, что это не объектно-ориентированное? Я смог использовать этот метод с моей существующей моделью без каких-либо изменений. Целью упражнения было попытаться сделать его более удобным для сохранения моих объектов, выполнив обновление вместо вставки delete +. Здесь уместно сопоставление между объектом и реляционными моделями; следовательно, ORM. – Will

+0

С NHibernate вы не сохраняете свои объекты. С NHibernate вы пишете объектно-ориентированный код и доверяете NHibernate волшебным образом, чтобы сохранить свои объекты соответствующим образом. Это значит, что вы должны работать в семантике языка C#. В C# вы не можете изменить тип объекта. При использовании NHibernate, вы не должны пытаться изменить тип объекта. – yfeldblum

Смежные вопросы