2012-04-12 94 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); 
}