単純なオブジェクトを重複レコードを含むテーブルにマッピングしていて、コードで重複を許可したいとします。このテーブルを更新/挿入/削除する必要はなく、レコードを表示するだけです。
マッピング ファイルに偽の (生成された) ID 列を配置して、NHibernate に行が一意であると思わせる方法はありますか? すべての列で重複が発生する可能性があるため、複合キーの作成は機能しません。
これが不可能な場合、この問題を回避する最善の方法は何ですか?
ありがとう!
編集:クエリが進むべき道のようでした
単純なオブジェクトを重複レコードを含むテーブルにマッピングしていて、コードで重複を許可したいとします。このテーブルを更新/挿入/削除する必要はなく、レコードを表示するだけです。
マッピング ファイルに偽の (生成された) ID 列を配置して、NHibernate に行が一意であると思わせる方法はありますか? すべての列で重複が発生する可能性があるため、複合キーの作成は機能しません。
これが不可能な場合、この問題を回避する最善の方法は何ですか?
ありがとう!
編集:クエリが進むべき道のようでした
NHibernate マッピングは、変更を保存することを前提としているため、何らかの ID が必要になります。
テーブルの変更が許可されている場合は、ID 列 (SQL Server の命名 - データベースは異なる場合があります) を追加して、一意の ID を自動生成できます。既存のコードは影響を受けません。
データベースへの追加は許可されているが、テーブルへの追加は許可されていない場合は、RowNumber 合成 (計算) 列を含むビューを定義し、それをデータ ソースとして使用して読み込むことができます。データベース ベンダー (およびビューとインデックスを処理する製品) によっては、パフォーマンスの問題が発生する場合があります。
私が試していない別の方法は、クラスをテーブルではなく SQL クエリにマップすることです。IIRC、NHibernate は、マッピング ファイルでの名前付き SQL クエリの使用をサポートしており、それらをテーブルやビューの代わりに「データ ソース」として使用できます。
データが読み取られている場合、ビューでクエリをラップし、ビューからエンティティを構築し、newguid() 列を追加するという簡単な方法が 1 つだけ見つかった場合、結果は次のようになります。
NEWGUID() を ID として選択 * FROM TABLE
ID は一意の主キーになります。上で述べたように、これは読み取り専用ビューにのみ役立ちます。クエリの後、ID には関連性がないためです。