2009-08-24 8 views
6

Mam jedną klasę samo-odwołującą się. Dziecko ma odniesienie do swojego rodzica, a rodzic ma listę dzieci. Ponieważ lista dzieci jest uporządkowana, próbuję odwzorować relację za pomocą NHibernate.Nhibernate - Lista mapowania nie aktualizuje Indeksy listy

To mój mapowania:

<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> 

Problem mam jest, gdy ma dwukierunkową mapowania dziecko < -> rodzic, indeks lista (ListOrder) nie są aktualizowane w bazie danych, gdy Robię mój taniec CRUD. Oznacza to, że gdy ja np. usuń dziecko, dostaję dziury na liście dzieci po zapisaniu w bazie danych i ponownym pobraniu rodzica. Jeśli usunę dwukierunkowość, nie mając wiele-do-jednego z dzieci do rodzica (i bez odwrotności = prawda), ListOrder jest poprawnie zaktualizowany.

Czy ktokolwiek z was to widział wcześniej? Czy istnieje jakieś proste rozwiązanie?

+0

jego ponieważ odwrotności = true, nie wiem, co jest najlepszym rozwiązaniem jest jednak, mając dokładnie ten sam problem w tej chwili. bądź czujny –

+0

Tak, to z powodu inverse = true. Jeśli bidir zostanie usunięty, wszystko działa tak, jak bym tego chciał, ListOrder-mądry. Chodzi o to, że sam muszę zaimplementować własność dzieci, której nie chcę. –

Odpowiedz

5

Tak, to z powodu inverse = true, alternatywnym rozwiązaniem byłoby użycie zestawu lub worka zamiast listy z order = "ListOrder", dodanie kolumny ListOrder jako właściwości do klasy MyClass z pustym ustawiaczem i getter, który zawsze zwraca jego indeks z kolekcji dziecka rodzica. Tak:

<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> 

i klasy

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

Dzięki za sugestię. W moim dzisiejszym kodzie używam hooków podczas dodawania/usuwania dzieci, aby poprawnie ustawić ListOrder. Zasadniczo pracuję nad NHibernate nie działa tak jak oczekuję, dodając logikę w mojej domenie. Twoja sugestia to kolejne obejście warstwy domeny. To może być lepsze niż moje, ale wciąż obejście. Jeśli semantyka dla mojej listy jest listą, chcę ją zmapować jako listę, a nie jako sortowaną torbę. –

+0

Podoba mi się pomysł na własność –