0

データベースへの変更を処理する際に、官僚主義が多すぎるという問題があります。おそらく最も奇妙なことに、このお役所仕事は、本番環境に導入されることのないデータベース スキーマを使用する、社内で開発されたテスト ツールに適用されます。数日以内にプライマリ テスト環境に変更を適用できますが、他のテスト環境に適用するには数週間かかる場合があります。更新されたマッピングが古いデータベースに適用されると、物事が完全に機能しなくなるため、これは NHibernate の使用に大混乱をもたらします。列は削除せず、必要に応じて追加するだけです。時折発生するバグや一般的な機能強化のため、テスト ツールのすべてのバージョンを最新の状態に保ちます。

マップされた列がデータベースに存在しない場合 (おそらくオブジェクトにデフォルト値を設定する場合)、NHibernate がその列を適切に無視するようにする方法はありますか?

現在、hbm.xml ファイルを使用しています。

4

1 に答える 1

0

これは何よりもソース管理の問題だと思います。通常、データベースとソフトウェアのバージョンは連動している必要があります。適切な分岐およびマージ戦略があれば、これに遭遇することはありません。実際に生産されているものに関連するバージョンのソースを常に用意する必要があります (私の意見では)。

ソフトウェア/データベースのバージョンがリリースされる状況では、そのバージョンに対応するリリース ブランチがあります。たとえば、データベース列が追加された場所でソフトウェアの変更を行う必要がある場合は、作業が行われた開発ブランチがあり、本番環境でリリースする準備ができたら、あなたが行ったものに対応する新しいリリース ブランチを作成します。生産にインストールされます。

製品版にバグ修正が必要な場合は、リリース ブランチから分岐してバグ修正を行うことができます。テストして本番環境にデプロイしたら、バグ修正ブランチで行われた変更をリリース ブランチにマージして、本番環境にあるものを再び表現します。次に、そのリリース ブランチからの変更を「最新」/メイン ブランチにマージします。

ここには、さまざまな分岐およびマージ戦略に関するいくつかの優れたガイドがあります: http://vsarbranchingguide.codeplex.com/releases

しかし、あなたの特定の質問に答えるために、これを行う素晴らしい方法はないと思います。マッピングにある場合、nhibernate はそれを照会するため、エラーが発生します。

編集:

特定の列のみを表示するために Hibernate で実行できることがあります。たとえば、更新と挿入では、動的な挿入と更新を行うようにマッピングを設定できます。

(7) dynamic-update (オプション、デフォルトは false): UPDATE SQL が実行時に生成され、値が変更された列のみが含まれるように指定します。

(8) dynamic-insert (オプション、デフォルトは false): INSERT SQL が実行時に生成され、値が null でない列のみが含まれるように指定します。

上記の引用: http://nhibernate.info/doc/nh/en/#mapping-declaration-class

また、nhibernate クエリでは、クエリする特定の列を指定できます。

IList selection =
    session.QueryOver<Cat>()
        .Select(
            c => c.Name,
            c => c.Age)
        .List<object[]>();
于 2014-02-21T19:37:58.803 に答える