2009-08-24 5 views
6

Ich habe eine selbstverweisende Klasse. Ein Kind hat einen Bezug zu seinem Elternteil und ein Elternteil hat eine Liste von Kindern. Da die Liste der Kinder geordnet ist, versuche ich, die Beziehung mit NHibernate zu verknüpfen.Nhibernate - Zuordnungsliste wird nicht aktualisiert Listenindizes

Das ist mein Mapping:

<class name="MyClass"> 
    <id name="Id"> 
    <generator class="native"/> 
    </id> 
    <list name="Children" cascade="delete" inverse="true"> 
    <key column="ParentId"/> 
    <index column="ListOrder"/> 
    <one-to-many class="MyClass"/> 
    </list> 
    <many-to-one name="Parent" class="MyClass" column="ParentId"/> 
</class> 

Das Problem, das ich habe, wenn ein bidirektionales Kind Mapping < mit -> Eltern wird die Liste Index (ListOrder) nicht in der Datenbank aktualisiert, wenn Ich mache meinen CRUD-Tanz. Dies bedeutet, dass wenn z.B. Entfernen Sie ein Kind, ich bekomme Löcher in der Kinderliste nach dem Speichern in der Datenbank und Holen der Eltern erneut. Wenn ich die Bidirektionalität lösche, indem ich von den Kindern zu den Eltern kein NULL-zu-Eins habe (und keine Inverse = true), wird die ListOrder korrekt aktualisiert.

Hat jemand von euch das schon mal gesehen? Gibt es eine einfache Lösung?

+0

seine wegen der inversen = true, nicht sicher, was die beste Lösung noch ist, mit genau das gleiche Problem im Moment. bleiben Sie dran –

+0

Yup, es ist wegen inverse = true. Wenn das Bidir entfernt wird, funktioniert alles wie gewünscht, ListOrder-weise. Die Sache ist, dass ich das Kindereigentum selbst implementieren muss, was ich nicht will. –

Antwort

5

Ja, es ist wegen inverse = true, eine alternative Lösung wäre, einen Satz oder eine Tasche anstelle der Liste mit order = "ListOrder" zu verwenden, fügen Sie die ListOrder-Spalte als eine Eigenschaft der MyClass-Klasse mit einem leeren Setter und hinzu Ein Getter, der seinen Index immer aus der untergeordneten Sammlung des übergeordneten Elements zurückgibt. Wie folgt aus:

<class name="MyClass"> 
    <id name="Id"> 
     <generator class="native"/> 
    </id> 
    <bag name="Children" cascade="delete" inverse="true" order-by="ListOrder"> 
     <key column="ParentId"/> 
     <one-to-many class="MyClass"/> 
    </bag> 
    <property name="ListOrder" column="ListOrder"/> 
    <many-to-one name="Parent" class="MyClass" column="ParentId"/> 
</class> 

und der Klasse

public class MyClass 
{ 
    public virtual int ID { get; set; } 
    public virtual IList<MyClass> Children { get; set; } 
    public virtual MyClass Parent { get; set; } 

    public virtual int ListOrder 
    { 
     get 
     { 
      if (Parent == null || !Parent.Children.Contains(this)) return -1; 
      return Parent.Children.IndexOf(this); 
     } 
     set { } 
    } 
} 
+3

Danke für Ihren Vorschlag. In meinem Code verwende ich heute Hooks beim Hinzufügen/Entfernen von untergeordneten Elementen, um die ListOrder korrekt zu setzen. Ich arbeite im Grunde um NHibernate funktioniert nicht wie erwartet, indem ich Logik in meiner Domäne hinzufügen. Ihr Vorschlag ist eine andere Problemumgehung für Domänenebene. Es könnte besser sein als meins, aber immer noch ein Workaround. Wenn die Semantik für meine Liste eine Liste ist, möchte ich sie als Liste abbilden, nicht als sortierten Beutel. –

+0

Ich mag die Eigentumsidee –