1

Oracleのレガシーデータベースを使用していて、一部のテーブルには、ドメインモデルでは不要なNOT-NULLに設定された列がありますが、明らかに、少なくともいくつかのデフォルト値をどこかに指定する必要がありますデータベースに保存されます(たとえば、Groupsテーブルには「インデント」列がある場合があります。thaqtは常にchar(8)値を期待します)。

NHibernateでこれをどのように処理しますか?これを行う「簡単な」方法はありますか?そうでない場合、私がこれを行う方法を誰かが知っていますか(私はインテセプターを使用することを考えましたが、実際にはどこから始めればよいのかわかりません...)。データベーススキーマを変更できないので、残念ながらこれはオプションではありません(流暢なバージョンでも問題ありません...)。

4

5 に答える 5

5

POCO を汚染したくない場合は、おそらくインターセプターが最適なオプションです。このようなインターセプターに関するさまざまな記事をご覧ください。

インターセプターでは、どのフィールドにダミー データを配置するかを確認するために、型を確認する必要があります。 OnFlushDirty メソッド (OnFlushDirty は「更新」) で currentState[] を使用し、OnSave メソッドで state[] を使用していることを確認してください ( "入れる")。例 (保存時):

if (entity is Group)
{
    state[Array.IndexOf(propertyNames, "Indentation")] = "dummy value";
    return true;
}
return false;

編集:

ドメインには存在しないが、データベース モデルで必要とされるデータを挿入しようとしているため、上記の方法ではうまくいきません。代わりに、state、propertyNames、および types 配列のそれぞれに要素を追加する必要があります。

于 2009-02-24T00:06:48.993 に答える
1

カスタムCRUD sqlを使用できます。Javaでは、属性のデフォルト値を持つプライベートセッターも機能すると思います

于 2009-02-24T00:03:39.907 に答える
0

NHibernate の答えは、IInterceptorを実装することです。

于 2009-02-24T00:07:12.330 に答える
0

IPropertyAccessor インターフェイスを使用する代替手段がありますhttp://elegantcode.com/2009/07/13/using-nhibernate-for-legacy-databases/を参照してください

于 2011-08-26T07:43:38.290 に答える
0

この種の問題は、列のデフォルト値を指定することで解決するのが最善だといつも思っていました。

そうすれば、それをまったく忘れて、インターセプターを実装する必要がなくなります。

サンプル SQL コードは次のとおりです。デフォルト値でテーブルを変更します。

DBはレガシーですが、新しい行を挿入できるため、DBをある程度制御できると思います。これは非常に安価で軽量なソリューションです。

于 2011-09-26T17:38:43.297 に答える