2012-04-12 2 views
0

Имеет устаревшую базу данных с структурами табличных таблиц, такими как следующее. Я пытаюсь понять, как плавно отображать этот тип отношений.Fluent nHibernate Mapping with Ternary Mapping Table

Существует несколько родительских таблиц, которые используют таблицу сопоставления для хранения заметок.

родительские таблицы, выглядеть следующим образом: Таблица
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 mapping. вы можете отобразить его доступ только для чтения

// 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); 
}