2012-04-12 15 views
0

以下のようなマッピングテーブル構造を持つレガシーデータベースがあります。私はどのようにこのタイプの関係をうまくマッピングするかを考えようとしています。3進マッピングテーブルを使用した流暢なnHibernateマッピング

マッピングテーブルを使用してメモを保存する複数の親テーブルがあります。

親テーブルは以下のようになります。
P1表
ID iSomething

P2表
ID iSomethingElse

親テーブルを取るマッピングテーブルがあるとノートテーブルにマップします。
マッピングテーブル
ID i_RecordUniqueID
ID i_NoteID
IDは

i_RecordIDがi_RecordUniqueID値から来た親テーブルを示す数値を含む列
をi_RecordID。マッピングテーブルはこれらの3つの列のみを持ち、三元の主キーです。ここで

がノートテーブルです:
(注)表
ID i_NoteID

次のようにテーブルP1のノートを見つけるためのクエリは次のとおりです。

Select n.* 
from P1 p 
inner join Mapping m on p.iSomething = m.i_RecordUniqueID and m.i_RecordID = 1 
inner join Note n on m.i_NoteID = n.i_NoteID 

テーブルP2のノートを見つけるためのクエリがされます次のようになります。

Select n.* 
from P2 p 
inner join Mapping m on p.iSomething = m.i_RecordUniqueID and m.i_RecordID = 2 
inner join Note n on m.i_NoteID = n.i_NoteID 

私の親テーブルのマッピングファイルには、以下のような関連があります。私はi_RecordID制約を追加する方法を知らない。

HasManyToMany<Note>(x => x.Notes) 
    .Table("Mapping") 
    .ParentKeyColumn("i_RecordUniqueID") 
    .ChildKeyColumn("i_NoteID") 
    .Cascade.All(); 

答えて

0

FluentNHibernatewはManyToAnyマッピングをまだサポートしていません。あなたは、読み取り専用アクセス

// P1Map() 
HasManyToMany(x => x.Notes) 
    .Table("Mapping") 
    .ParentKeyColumn("i_RecordUniqueID") 
    .Where("i_RecordID == 1") 
    .ChildKeyColumn("i_NoteID") 
    .Cascade.All(); 

// P2Map() 
HasManyToMany(x => x.Notes) 
    .Table("Mapping") 
    .ParentKeyColumn("i_RecordUniqueID") 
    .Where("i_RecordID == 2") 
    .ChildKeyColumn("i_NoteID") 
    .Cascade.All(); 

のためにそれをマップすることができます。また、コンポーネントを作成する必要が

ICollection<TableToNote> Notes; 

public TableToNoteMap() 
{ 
    ReferencesAny(x => x.Parent).IdentityColumn("i_RecordUniqueID").MetaTypeColumn("i_RecordID")...; 

    References(x => x.Note); 
} 
関連する問題