2010-07-28 5 views
1

Dans un projet sur lequel je travaille, nous utilisons des onglets. Ces onglets ont du contenu. Plusieurs objets de contenu peuvent être sur un onglet. Nous pourrions donc avoir un onglet 'voiture', et cet onglet de voiture pourrait afficher un objet de contenu de berline, un objet de contenu suv et un objet de contenu de camion. L'utilisateur peut également spécifier qu'il contient plus ou moins de ces objets et les commander comme bon lui semble. Il est important pour nous de maintenir l'ordre de ces objets de contenu selon les spécifications de l'utilisateur.Fluid nHibernate utilisant AsList() renvoie des objets NULL en fonction de l'objet SortOrder

Voici mes applications:

Sur la mise en correspondance Tab:

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

Sur la cartographie ContentObject:

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

La table d'association est:

TabContentObjectId Tabid ContentObjectId SortOrder int not null

Je peux ajouter un objet de contenu, réorganiser un objet de contenu dans un onglet , et tout va bien. nHibernate ajoute/met à jour le SortOrder de manière appropriée. Le problème vient quand j'essaye de supprimer un objet contenu . Lorsque je vais supprimer les onglets de ce contentObject, contentObject.Tabs a l'air bizarre.

Voici le code que j'utilise pour supprimer les onglets:

  //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); 
} 

Si c'est le seul ou le premier (SortOrder = 0) contentObject dans un onglet, je peux supprimer. S'il s'agit du second objet de contenu, contentObject.Tabs ressemble à [0] [null], [1] [Tab]. S'il s'agit du quatrième objet contentObject sur l'onglet, contentObject.Tabs ressemble à [0] [null], [1] [null], [2] [null], [3] [Tab]. Ainsi, en fonction de la colonne SortOrder dans la table d'association, il semble que plusieurs références NULL soient renvoyées, et ne peuvent donc pas être supprimées en raison d'une référence NULL. Je ne peux pas comprendre pourquoi ces nulls sont retournés. Toute aide serait appréciée.

Répondre

1

J'ai résolu ce qui suit:

Tab Carte:

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

Contenu Carte de l'objet:

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

Je ne le besoin asList sur une carte. J'ai également fait l'onglet le parent.

Pour supprimer les onglets:

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

Avec cette configuration, le contenu d'un onglet est commandé la façon dont nous voudrions. Le tri est automatiquement mis à jour par nHibernate sur les mises à jour, les ajouts, les suppressions.

Questions connexes