2012-07-17 184 views
3

我有一個多對多的分層情況,我只是無法弄清楚如何解決明智的映射。流利的nhibernate多對多與以下多對多映射

我有一個實體事件。這個事件可以有很多事件。一個事件不過是一個價值對象,所以我創建了一個多對多的映射,它工作得很好。

現在到了位,我不能找出...選擇一個事件的每一個事件可以有多種原因(這是一個值對象也一樣)

下面是簡單的數據模型(事件和原因都存儲在SystemValues和具有類型作爲其discriminatorvalue): enter image description here

(在表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' subclassmapped):

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中。我可能需要告訴Nhibernate如何使用IncidentEventID。 我需要讓事件知道它與事件的多對多關係,並且它與事件的關係如下,但我恐怕我不知道如何。

希望有人能指出我正確的方向。

回答

2

如果可能,您應該重構數據庫模式並使用事件Id在表IncidentEventCause中交換IncidentEventId。

你想要的映射是不容易的。這裏是一個解決方法,其中持久性泄漏到域中。

public class IncidentMap : ClassMap<Incident> 
{ 
    public IncidentMap() 
    { 
     Id(x => x.ID).GeneratedBy.Identity(); 

     HasManyToMany(x => x.Events) 
      .Table("IncidentEvent") 
      .ParentKeyColumn("IncidentID") 
      .ChildKeyColumn("EventID") 
      .ChildWhere("type=" + (int)SystemValue.Type.Event); 
    } 
} 

public class Event 
{ 
    private EventDetails Details { get; set; } 
    public string Name { get { return Details.Name; } set { Details.Name = value; } } 

} 

class EventDetails : SystemValue 
{ 
    public virtual string Name { get; set; } 
} 

public class EventMap : ClassMap<Event> 
{ 
    public EventMap() 
    { 
     Table("IncidentEvent"); 

     Id(x => x.Id, "Id").GeneratedBy.Identity(); 

     References(x => x.Incident, "IncidentID"); 
     References(Reveal.Member<Event>("Details"), "EventID").Not.LazyLoad(); 

     HasManyToMany(x => x.Causes) 
      .Table("IncidentEventCause") 
      .ParentKeyColumn("IncidentEventID") 
      .ChildKeyColumn("CauseID"); 
    } 
} 

public class EventDetailsMap : SubclassMap<EventDetails> 
{ 
    public EventDetailsMap() 
    { 
     DiscriminatorValue((int)SystemValue.Type.Event); 
     Map(x => x.Name); 
    } 
} 

public class CauseMap : SubclassMap<Cause> 
{ 
    public CauseMap() 
    { 
     DiscriminatorValue((int)SystemValue.Type.Cause); 
     Map(x => x.Name); 
    } 
} 
+0

謝謝!我想我的思維方式真的陷入了困境。我根據您的建議重構了所有內容,現在所有功能都可以使用。 – scratchyback 2012-07-18 13:50:41

+0

很高興我能幫上忙 – Firo 2012-07-18 17:59:17