2009-05-05 9 views
8

プライマリキー/リファレンスを持たないデータベーステーブルへのマッピングを作成しようとしています。Fluent-NHibernateテーブルマッピング(プライマリキーなし)

public class TestMap : ClassMap<<Test>Test> { 

    public TestMap() { 

     WithTable("TestTable"); 

     Map(x => x.TestColumn); 

    } 

} 

これは失敗し、idまたはcomposite-idが必要です。これは流暢なnhibernateで可能ですか?

+0

'マークされていない'プライマリキーがありますか?つまり、フィールドのコレクションによってプライマリキーが作成されていますが、プライマリキーが定義されていません。 –

答えて

2

いいえこのテーブルをマップするには、SQL ServerのID列などの代理主キーを追加する必要があります。私が知る限り、これはNHibernate自体ではサポートされていません。

なぜこのテーブルにプライマリキーがないのですか?

+5

私はこの質問に対する答えも欲しいです。時には(実際にはほとんどの場合)、私たちは未成年シナリオで作業していません。代わりに、変更できない既存のdbスキーマに新しい流暢なNHibernate DALを置いています。私は、識別カラムと明確に定義されたキーのないテーブルを持っています。私がこのスキーマを変更することができたら、私たちは望みますが、データベーススキーマを変更しないという要件があります。 –

4

Oracleでは、少なくとも私はこれに "ROWID"を使用しました。 mssqlの場合は、テーブルへの読み取り専用アクセスのために "ROW_NUMBER()"組み込み関数を使用するかもしれませんが、私はそれを試しませんでした...

+0

どのような栄光の小さなハック。 IDカラムをROWIDにマッピングしようとしましたが、NHibernateは何の問題もないようです。ありがとう! – rie819

0

この機能はnhibernateでサポートされていません。しかし、一般的な経験則として、実際には何らかのIDを持っている必要があります。必要のない状況にいる場合は、データモデルを評価する必要があります。テーブル固有のプライマリキーであろうと、別のテーブルからのサロゲートキーであろうと、IDが存在するはずです。これは、nhibernateがテーブルを処理できるようにするだけでなく、インデックス作成によるパフォーマンスの向上に役立ちます。

nhibernateがニーズを満たしていないと仮定する前に、テーブルにキーがない理由とそれを持たない理由を考えてみましょう。

0

我々は、我々は以下のように流暢を使用することができ、主キー/アイデンティティcoulmnを持たないテーブルから列をもたらすことができた場合:

Id(x => x.TempID).Column("TempID"); 
0

テーブルが別のエンティティに属するデータが含まれている場合、あなたはそれをマップすることができのコンポーネントとしてとしています。コンポーネントはそれ自体では識別されませんが、別のエンティティに属します。です。

0

エンティティをデータベースに定義されたキーのないテーブルにマップできます。私はこれまでのSQL Serverデータベースでそうしています。ただし、表に候補キー(実際には固有の値の組み合わせが格納されている列セット)が必要です。 エンティティのコンセプトには、アイデンティティという概念が関係しています。 代わりに、あなたのコードでしようとしているのは、アイデンティティなしにエンティティをマップすることです。これは不可能です。

関連する問題