2013-09-23 134 views
0

我似乎無法找到什麼,我想做的事,使用NHibernate映射通過代碼一個很好的例子:NHibernate的映射 - 如何填充對象樹與嵌套集合

我有一個對象「消息」那裏有一個「有機體」列表,每個「有機體」有一個「藥物」列表。請在下面原諒我的僞例如:

  public class Message 
      List<Organism> Organisms; 

      public class Organism 
      List<Drugs> Drugs; 

      public class Drug 

      //create our tree structure 

      var message=new Message(); 

      var drug = new Drug(); 
      var organism = new Organism(); 
      organism.Drugs.Add(drug); 

      message.Organisms.Add(organism); //now we have a message with one organism child with one drug drug 

在我的類映射使用掌上電腦,我可以正確保存該消息對象,並將它堅持正確。問題是使用消息標識調用Get以返回消息時。我收到「收集不與任何會話相關」

至於我的映射器,我的信息有一袋有機體,裏面有一袋毒品。

有沒有人有一個與nHibernate映射的代碼做這種類型的事情的例子?我在映射器中丟失了一些東西...

回答

0

如果您想要雙向映射,您需要多做一點。

所以我會在生物體類上定義一個消息屬性。並將其作爲參考。

在您的集合類的父類上添加添加/刪除屬性,以便您可以將該元素添加到列表並將此引用添加到您的子對象。

public class Message 
{ 
    public Int32 Id { get; set; } 
    public IList<Organism> Organisms { get; protected set; } 

    public Message() 
    { 
     Organisms = new List<Organism>(); 
    } 

    public void AddOrganism(Organism organism) 
    { 
     if (Organisms.Contains(organism)) 
      return; 

     organism.Message = this; 
     Organisms.Add(organism); 
    } 

    public void RemoveOrganism(Organism organism) 
    { 
     if (!Organisms.Contains(organism)) 
      return; 

     Organisms.Remove(organism); 
    } 
} 

public class Organism 
{ 
    public Int32 Id {get;set;} 
    public Message Message { get; set; } 
} 

至於您的映射,您需要將Message.Organisms設置爲一個袋子上Organism.Message到多對一。對於下一個級別,請重複此操作。

public class MessageMap 
{ 
    public MessageMap() 
    { 
     Bag(x => x.Organisms, map => 
     { 
      map.Key(k => 
      { 
       k.Column(col => col.Name("MessageId")); 
      }); 
      map.Cascade(Cascade.All | Cascade.DeleteOrphans); 
     }, 
     action => action.OneToMany()); 
    } 
} 

public class OrganismMap 
{ 
    public OrganismMap() 
    { 
     ManyToOne(x => x.Message, map => 
     { 
      map.Column("MessageId"); 
      map.NotNullable(false); 
     }); 
    } 
} 
+0

感謝您的建議Fran。一些事情......我應該指出,我真的不需要雙向映射,只需要一個定向映射就可以。而且我更好奇如何將所有三個對象映射在一起。所以消息有幾種有幾種藥物的生物體。在你的例子中,你只有消息和生物體。謝謝! –

+0

我沒有添加下一級,因爲它與上面顯示的相同。只需將Bag映射添加到生物體中,並參考Drugs。 Drugs地圖在答案中看起來完全像生物地圖。 – Fran