2010-12-13 3 views
0

これは、他の人が出会ったという状況でなければならないので、私は質問したいと思った。 nHibernate内の時間的関係を表現する問題に対して、人々に良い汎用ソリューションを実装させましたか?この問題は、私が制御できないデータベース内に存在するので、DBモデルが間違っていると教えてください。私はそれを変更することはできません。データベースで実行されるNHibernateとTemporalの関係

子の有効時間が親の有効時間内でなければならない単純な親:子関係があります。単純にParent.ValidFromを入力します。< = Child.ValidFrom & & Parent.ValidTo> = Child.ValidTo。このルールはデータベースに適用されます。つまり、レコードに違反するUPDATEステートメントを発行することはできません。それは交渉可能ではありません。

重要なことは、DBに変更を書き込む順序に影響することを意味します。

  1. 子= 2個のUPDATEを展開します。
    i。親を展開します。 ii。子を展開します。
  2. 親を2つ更新する。
    i。子供を契約する。 ii。親に契約する。
  3. 今後の更新では、親と子を現在の3つのUPDATEに移動します。
    i。親ValidToを変更します。 ii。子を動かす。
    iii。 Parent.ValidFromを移動します。
  4. 過去の= 3回のUPDATEで、親と子を現在まで移動しています。
    i。親ValidFromを変更します。 ii。子を動かす。
    iii。 Parent.ValidToを移動します。

更新の順序は非常に重要であることがわかります。私たちはnHibernateのデフォルトのアップデートに依存するだけではありません。また、nHibernateが通常は1つのエンティティで2つのUPDATEを実行する必要がある場合もあります。

ドメインモデル(おそらく[属性]装飾されたクラスを使用)で一般的な一時的な親:子を表すことができますし、いくつかのコードは私のために大変です。

誰もがこの問題にぶつかり、助言を与えることができますか?

私は自分のDBスキーマを制御できないので、私はモデル全体に​​適用できる一般的なものを書きたいと思います。唯一の注意点は、私がメモリ内で修正したオブジェクトをコミットすることだけです。だから、正しいValidFrom/ValidTo日付が何であるかを決めるコードを書くつもりはない。

答えて

1

NHが更新ステートメントを発行する順序を制御できないため、最も適切な処置は、おそらくIStatelessSessionを使用して「手動で」更新を行うことです。

あなたは本質的に変更の追跡を断念します。どのオブジェクトを更新するかNHに伝える必要があります。

関連する問題