使用三元映射表的流畅nHibernate映射

时间:2012-04-12 17:30:48

标签: nhibernate fluent-nhibernate-mapping ternary

具有映射表结构的旧数据库,如下所示。我试图弄清楚如何流利地映射这种类型的关系。

有多个父表使用映射表来存储笔记。

父表格如下所示:
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();

1 个答案:

答案 0 :(得分: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);
}