0

大規模な既存システムに nHibernate マッピングを実装しようとしています。2 つのオブジェクト間の関係をマッピングしようとしています。1 つのオブジェクトは、システム全体のさまざまなオブジェクトに関連する「添付ファイル」です。したがって、データベースには、それ自体を関連付けるために使用する2つの列があります

アイテムタイプ

アイテム ID

添付ファイルのある製品がある場合、ProductId = ItemId と ItemType は定義済みの値、たとえば '0001' になります。ユーザー オブジェクトが '0002' の場合、Order は '0003' など、他の ItemTypes の場合もあります。

これを nhibernate でマップする必要があります。したがって、製品オブジェクトに添付ファイルのコレクションが必要ですが、これは ItemId と ItemType の両方にマッピングすることを意味します

必要だったのが ItemId マッピングだけだった場合は、それを行うことができます

HasMany(x => x.Attachments).KeyColumn("ProductId");

しかし、代わりに、添付テーブルの KeyColumn "ProductId" と ItemType が "0001" に等しい場所にマップする必要があります

どうすればこれを行うことができますか...?

構造 製品表

[製品]

製品番号

名前

説明

アタッチメント表

【添付】

添付URL

アイテム ID

アイテムタイプ

4

2 に答える 2

1

私がすることは、次のような基本的な抽象的な添付ファイルタイプを作成することです:

public abstract class Attachment
{
    public TYPE AttachmentURL { get; set; }
}

次に、添付ファイルの「タイプ」ごとにサブクラスを作成します。

public class ProductAttachment : Attachment
{
    protected ProductAttachment() { }

    public ProductAttachment(Product parent)
    {
        Parent = parent;
    }

    public Product Parent { get; protected set; }
}

次に、Attachment マッピングに次の行を含めます。

DiscriminateSubClassesOnColumn("ItemType");

次に、各サブクラス マッピングに 'DiscriminatorValue' 呼び出しを追加します。例えば:

// Inside ProductAttachment mapping
...
DiscriminatorValue("0001");
...

次に、通常どおりにすべてをマッピングします。これにより、「親」が製品である必要がある「ProductAttachment」のリストが製品に含まれるという追加の利点が得られます。

データベースから基本タイプの「Attachment」(「ProductAttachment」ではなく) のみを取得する場合、奇妙な点が生じる可能性がありますが、そのブリッジが発生した場合に渡ることはできます。

于 2012-08-30T17:09:58.310 に答える
0

ここで答えを見つけました

流暢な Nibernate が where 句をマッピングに配置する

そのようにマッピングをハードコーディングできます

HasMany(x => x.Children).Where("ItemType='0001'");
于 2012-08-31T08:31:40.337 に答える