2010-12-13 5 views
0

Это должна быть ситуация, с которой сталкиваются другие люди, поэтому я решил задать вопрос. Попросите людей реализовать хорошие общие решения проблемы представления временных отношений в nHibernate. Эта проблема существует в базе данных, над которой у меня нет контроля, поэтому, пожалуйста, не говорите мне, что модель DB неверна. Я не могу его изменить.NHibernate & Temporal отношения, установленные в базе данных

У нас есть простая связь между родителями: дети, где Действующее время ребенка должно находиться в пределах допустимого времени родителя. Просто поставьте Parent.ValidFrom < = Child.ValidFrom & & Parent.ValidTo> = Child.ValidTo. Это правило применяется в базе данных, то есть я не могу выпустить инструкцию UPDATE, которая заставит записи нарушать ее. Это не подлежит обсуждению.

Важно отметить, что это влияет на порядок, в котором я записываю изменения в БД.

  1. Расширение ребенка = 2 ОБНОВЛЕНИЯ.
    i. Развернуть родительский.
    ii. Развернуть ребенка.
  2. Подписание родителя = 2 ОБНОВЛЕНИЯ.
    i. Контракт ребенка.
    ii. Контракт Родитель.
  3. Перемещение родителя и ребенка на будущее в будущем = 3 ОБНОВЛЕНИЯ.
    i. Изменить родительский ValidTo.
    ii. Переместите ребенка.
    iii. Переместить родительский. ValidFrom.
  4. Перемещение родителя и ребенка на сегодняшний день в прошлом = 3 ОБНОВЛЕНИЯ.
    i. Измените родителя ValidFrom.
    ii. Переместите ребенка.
    iii. Переместить Parent.ValidTo.

Итак, мы видим, что порядок, в котором происходят обновления, очень важен. Мы не можем просто полагаться на обновления nHibernate по умолчанию. Кроме того, в некоторых случаях нам нужно сделать два UPDATE в одном объекте, где nHibernate обычно делает это.

Итак, я хочу перейти к тому, что я могу выразить общий временный родитель: ребенок в моей модели домена (возможно, используя [атрибут] украшенные классы), и у меня есть какой-то код для меня.

Кто-нибудь сталкивался с этой проблемой и мог ли кто-нибудь дать совет?

Пожалуйста, помните, что я не контролирую свою схему БД и хочу написать что-то общее, которое может быть применено ко всей моей модели. Единственное предостережение в том, что я только забочусь об объектах, которые я исправил в памяти. Поэтому я не ожидаю написать какой-то код, чтобы решить, какие правильные даты ValidFrom/ValidTo.

ответ

1

Поскольку у вас нет контроля над порядком, в котором NH выдает обновления, лучший способ действий, вероятно, использовать IStatelessSession для выполнения обновлений «вручную».

Вы по существу отказываетесь от отслеживания изменений; вам нужно указать NH, который хочет обновить.

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