私は多対多の階層的な状況にあり、マッピングを賢く解決する方法がわかりません。
エンティティ インシデントがあります。このインシデントには多くのイベントが含まれる場合があります。イベントは値オブジェクトに他ならないので、完全に正常に機能する多対多のマッピングを作成しました。
ここで、私が理解できないビットが来ます...インシデントに対して選択されたすべてのイベントには、複数の原因が含まれる場合があります (これは値オブジェクトでもあります)。
以下は単純化されたデータモデルです (イベントと原因は両方とも SystemValues に格納され、Type が識別子の値として含まれます)。
(テーブル IncidentEvent の ID は、複合キーの手間を避けるための代理主キーです)
私のマッピングは次のとおりです (簡略化): インシデント:
public class IncidentMap : ClassMap<Incident> {
public IncidentMap() {
Table("Incident");
Id(x => x.ID).GeneratedBy.Identity();
HasManyToMany(x => x.Event)
.Table("IncidentEvent")
.ParentKeyColumn("IncidentID")
.ChildKeyColumn("EventID");
}
}
イベント (一般的な「SystemValueMap」からサブクラスマップされたもの):
public class EventMap : SubclassMap<StoryWhere> {
public EventMap() {
DiscriminatorValue((int)SystemValue.Type.Event);
HasManyToMany(x => x.Incident)
.Table("IncidentEvent")
.ParentKeyColumn("IncidentID")
.ChildKeyColumn("EventID");
HasManyToMany(x => x.Cause)
.Table("IncidentEventCause")
.ParentKeyColumn("IncidentEventID")
.ChildKeyColumn("CauseID");
}
}
原因:
public class CauseMap : SubclassMap<Cause> {
public CauseMap() { DiscriminatorValue((int)SystemValue.Type.Cause); }
}
ご覧のとおり、「イベント」のマッピングはごちゃごちゃで、もちろん機能しません。挿入が完了すると、NHibernate が EventID をテーブル IncidentEventCause の列 IncidentEventID に挿入しようとするため、foreignkey 制約が発生します。おそらく、代わりに IncidentEventID を使用する方法を Nhibernate に伝える必要があります。イベントに、インシデントとの多対多の関係と、原因との関係に従うことを認識させる必要がありますが、どうすればよいかわかりません。
誰かが私を正しい方向に向けることができることを願っています。