4

Ruleというテーブルにマップするエンティティがあります。このエンティティのテーブルには、Categoryと呼ばれる別のテーブルへのFKがあります。RuleエンティティのCategoryからプロパティを取得する方法を理解しようとしています。エンティティマッピングで結合を使用したいのは確かですが、それが機能するように構成する方法がわかりません。これが私のマッピングです:

Join("Category", x => 
{
    x.Map(i => i.CategoryName, "Name");
    x.KeyColumn("CategoryId");
    x.Inverse();
});

これが生成しているSQLです...

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.Id=rules0_1_.CategoryId
WHERE ...

これが私が欲しいSQLです。

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.CategoryId=rules0_1_.Id
WHERE ...

これを可能にするJoinPartには何も見つからないようです。Subselectは、私が見つけた少しのドキュメントからは有望に見えますが、その使用方法の例は見つかりません。この問題に関するアドバイスをいただければ幸いです。ありがとう!

4

1 に答える 1

7

「参加」という名前はよくありません。NHibernateマッピングの「結合」は、2つのテーブルの主キーの関係に基づく0対1の関係を意味します。たとえば、UserテーブルとUserAdditionalInfoテーブルがあり、ユーザーごとに0または1つのレコードがある場合は、結合を使用します。UserAdditionalInfoテーブルは、外部キーとそれ自体の主キーの両方としてUserからのPKを参照する可能性があります。このタイプのことは、DBAがレガシーアプリのスキーマを忠実に維持する必要がある場合に一般的ですが、新しいアプリでは同じ概念レコードに対して新しいフィールドが必要です。

状況で実際に必要なのは、参照関係です。この場合、レコードには、ゼロまたは他の1つのレコードに対する外部キー関係があります。あなたはそれを次のように流暢に設定するでしょう:

References(x=>Category)
    .Column("CategoryId")
    .Inverse()
    .Cascade.None();

これに伴う問題は、カテゴリをマッピングする必要があることです。それは今あなたのものに関連している別の実体です。オプションは、このモデルを使用するか、エンティティ参照をプライベートにするか、マッピングを変更してエンティティ自体にアクセスし、パブリックにするプロパティへの「パススルー」をコーディングするか、コードを使用してモデルを「フラット化」することです。 AutoMapperのようなツールを使用して、このディープドメインモデルを実行時にフラットなDTOに投影し、一般的に使用します。それらはすべて長所と短所があります。

于 2011-06-14T22:30:40.670 に答える