2012-04-12 97 views
0

具有映射表結構的遺留數據庫,如下所示。我想弄清楚如何流利地映射這種類型的關係。流利的nHibernate映射與三元映射表

有多個父表使用映射表來存儲註釋。

的父表如下所示:
P1表
ID iSomething

P2表
ID iSomethingElse

有,將採取一個父表中的映射表,並將其映射到筆記表。
映射表
ID i_RecordUniqueID
ID i_NoteID
ID i_RecordID

列i_RecordID包含數字值指示哪個父表中的值i_RecordUniqueID來自。映射表只有這三列,並且是三元主鍵。

這裏是記表:
注表
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); 
}