0

次のようなマッピング テーブル構造を持つレガシー データベースを用意します。このタイプの関係を流暢にマッピングする方法を見つけようとしています。

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

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

P2 テーブル
ID iSomethingElse

親テーブルを取り、それをメモ テーブルにマップするマッピング テーブルがあります。
マッピング テーブル
ID i_RecordUniqueID
ID i_NoteID
ID i_RecordID

列 i_RecordID には、i_RecordUniqueID 値がどの親テーブルから来たかを示す数値が含まれています。マッピング テーブルにはこれら 3 つの列のみがあり、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();
4

1 に答える 1

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);
}
于 2012-04-18T06:54:13.187 に答える