2

会社のアプリケーション用のデータ転送ツールを作成して、古いバージョンから新しいバージョンにデータを移動し、元に戻します。今は NHibernate と FluentMapping を使用しているため、古いテーブルをすべてマップする必要がありますが、構成された主キーを持つ 1 つのテーブルに問題があります。テーブルは次のようになります。

public class OldTable {
 public string KeyOne {get;set}
 public string KeyTwo {get;set}
 public string KeyN {get;set}
 public int Sequence {get;set}
 ...
}

そして、上記のすべてのフィールドを複合キーとしてマップする必要があります。唯一の問題は、「シーケンス」が他のフィールドに基づいて増加し、キーの重複を回避することです。他のフィールドは外部キーと単純な文字列が混在しています。このマッピングを行う方法はありますか? Sequence を計算するために式を作成する必要がある場合は、問題ありません。

幸いなことに、新しいシステムのテーブルは整数 ID のみを使用します。

4

2 に答える 2

0

ドキュメントから:

IIdentifierGeneratorを使用して複合キーを生成することはできません。代わりに、アプリケーションは独自の識別子を割り当てる必要があります。

これは、HBM XML スキーマにも見られます。 <id>a<generator>を指定できますが、指定でき<composite-id>ません。

この機能を NHibernate に追加できなかったと言っているわけではありません。これが役に立つ場合は、NHibernate issue trackerに機能リクエストを送信してください。この機能が最初に Hibernate に実装されている場合、機能要求が成功する可能性が最も高くなります。そうであれば、移植するのは簡単かもしれません。すでに Hibernate で実装されている可能性があるようです: HHH-2060

于 2013-11-01T18:56:47.013 に答える
-2

そうです、レガシー データベースの NHibernate マッピングを作成しようとするのは、まったくの苦痛です。複合キーは、特に楽しい分野です。

すべてのフィールドを主キーとしてマップする必要があると言うときは、テーブルに最大で 1 つの主キーしか持てないため、複合キーを意味すると仮定します。その場合、マッピング クラスの次のようなものは機能しませんか?

CompositeId()
    .KeyProperty(x => x.KeyOne).KeyProperty(x => x.KeyTwo)
    .KeyProperty(x => x.KeyN).KeyProperty(x => x.Sequence)

レガシーデータベースからデータを読み込もうとしているだけなら、運がいいかもしれませんが、それが私だった場合、このシナリオでは、NHibernate を古いレガシーデータベースにマップしようとするのを避けて、データマッピングコードを書くだけです。手で。私の経験では、おそらくより速く、より簡単で、痛みが少ないでしょう.

于 2012-05-29T15:46:54.260 に答える