1

現在、nHibernate がプロジェクトの要件をサポートしているかどうかを評価しています。データベースを別のアプリケーションと共有しているため、スキーマの変更に関して完全に自由になるわけではありません。一部の列には、固有の連続した番号が入力されます (請求書など)。次の番号は、番号が連続していることが保証されるように、ロック アルゴリズムも実装するストアド プロシージャによって決定されます。一方では、空の値または特別な値が提供されたときに列の値を設定するトリガーをそれぞれのテーブルに定義できます。これには、既存のデータベース定義を変更する必要がありますが、これを実装する最も信頼できる方法かもしれません。データベース定義の変更を避けるために、nHibernate ORM でこれを解決しようとしています。私達' 最初に、空の値が指定された場合に NullSafeSet でストアド プロシージャを呼び出すユーザー タイプを実装しようとしました。残念ながら、NullSafeSet が呼び出された時点では、提供されたコマンドの接続とトランザクションはまだ設定されていません。

nHibernate でこれをどのように解決できますか?

前もって感謝します、

マーカス

4

1 に答える 1

1

トリガー ルートを使用する場合は、生成された属性をプロパティマッピングに追加する必要があります。

生成されたプロパティは、データベースによって生成された値を持つプロパティです。通常、NHibernate アプリケーションは、データベースが値を生成するプロパティを含むオブジェクトを更新する必要がありました。ただし、プロパティを生成済みとしてマークすると、アプリケーションはこの責任を NHibernate に委任できます。基本的に、生成されたプロパティを定義したエンティティに対して NHibernate が SQL INSERT または UPDATE を発行するときはいつでも、生成された値を取得するためにその後すぐに選択を発行します。

それとは別に、列にトリガーまたはデフォルトの制約を追加せずに、NHibernate が発行した INSERT からストアド プロシージャを呼び出す方法がよくわかりません。


編集

NHibernate には、 interface を介したクラス永続化の概念があるようIEntityPersisterです。多分あなたはそこから何かをハックすることができます.

persister 属性を使用すると、クラスに使用される永続化戦略をカスタマイズできます。たとえば、NHibernate.Persister.EntityPersister の独自のサブクラスを指定したり、たとえばストアド プロシージャの呼び出し、フラット ファイルへのシリアル化、またはLDAP。(Hashtable への「永続化」の) 簡単な例については、NHibernate.DomainModel.CustomPersister を参照してください。

NHibernate のソースから開始できます。

データベースにトリガーを追加できる場合は、NHibernate の内部構造と戦うために多くの時間を費やすことなく、おそらく最善の、簡単な方法です。

于 2012-07-10T14:47:02.157 に答える