2010-07-28 74 views
1

在我正在開發的一個項目中,我們使用了選項卡。這些標籤包含內容。多個內容對象可以在選項卡上。所以我們可以有一個'汽車'標籤,那個汽車標籤可以顯示一個轎車內容對象,一個suv內容對象和一個卡車內容對象。用戶也可以指定它包含更多或更少的這些對象,然後根據需要訂購它們。對於我們來說,維護這些內容對象的順序對用戶規範非常重要。使用AsList()的流利nHibernate根據SortOrder返回空對象

這裏是我的映射:

在標籤映射:

HasManyToMany(t => t.ContentObjects) 
     .Table("TabContentObjects") 
     .ParentKeyColumn("TabID") 
     .ChildKeyColumn("ContentObjectID") 
     .AsList(index => index.Column("SortOrder")); 

在ContentObject映射:

HasManyToMany(c => c.Tabs) 
     .Table("TabContentObjects") 
     .ParentKeyColumn("ContentObjectID") 
     .ChildKeyColumn("TabID") 
     .Cascade.SaveUpdate() 
     .AsList(index => index.Column("SortOrder")); 

關聯表是:

TabContentObjectId TabId ContentObjectId SortOrder int not null

我可以添加一個內容對象,在 選項卡內重新排序內容對象,並且一切正常。 nHibernate正在適當地添加/更新SortOrder 。當我嘗試刪除內容 對象時,問題就出現了。當我去從這個contentObject中刪除標籤時,contentObject.Tabs看起來很奇怪。

這裏是我使用刪除的選項卡中的代碼:

  //Need to remove each through the contentObject since it is parent 
      foreach (Tab tab in deleteContentObject.Tabs) 
      { 
       tab.RemoveContentObject(deleteContentObject); 
      } 

//in Tab class 
public virtual void RemoveContentObject(TabContentObject item) 
{ 
    if (ContentObjects == null) ContentObjects = new List<TabContentObject>(); 
    ContentObjects.Remove(item); 
} 

如果它是唯一的,或所述第一(SortOrder的= 0)一標籤中contentObject,我可以刪除。如果它是第二個內容對象,contentObject.Tabs看起來像[0] [null],[1] [Tab]。如果它是選項卡上的第四個contentObject,則contentObject.Tabs看起來像[0] [null],[1] [null],[2] [null],[3] [Tab]。所以,根據SortOrder列在關聯表中的含義,我似乎有很多返回的空引用,因此無法由於空引用而被刪除。我無法弄清楚爲什麼這些空值被返回。任何幫助,將不勝感激。

回答

1

我有以下的解決了這個:

標籤地圖:

 HasManyToMany(t => t.ContentObjects) 
      .Table("wfdc_Tab_TabContentObjects") 
      .ParentKeyColumn("TabID") 
      .ChildKeyColumn("ContentObjectID") 
      .Cascade.SaveUpdate() 
      .AsList(index => index.Column("SortOrder")); 

內容對象地圖:

 HasManyToMany(c => c.Tabs) 
      .Table("wfdc_Tab_TabContentObjects") 
      .ParentKeyColumn("ContentObjectID") 
      .ChildKeyColumn("TabID") 
      .Inverse(); 

所以我只需要AsList上一個地圖。我也讓Tab成爲父母。

要刪除標籤:

   foreach (Tab tab in deleteContentObject.Tabs) 
       { 
        tab.ContentObjects.Remove(deleteContentObject); 
       } 

利用這種結構,標籤的內容是有序的,我們希望的方式。排序由nHibernate在更新,添加,刪除時自動更新。