2011-08-19 19 views
10

Próbuję zapisać (wstawić) jednostkę nadrzędną z listą Podmioty podrzędne. Obie jednostki używają Guid jako kluczy podstawowych. Klucze nie mają wartości zerowej i nie istnieje żadna relacja klucza w bazie danych.Wstawianie nadrzędnego i podrzędnego z NHibernate w tym samym czasie

Zapis nie działa, generowany jest wyjątek zgłaszający - że próbuję zapisać wartość zerową w kluczu rodzica obcego w tabeli Dziecko.

Oczekiwano, że nhibernate utworzy klucz dla jednostki nadrzędnej i niech jego obiekty podrzędne będą o tym wiedzieć. Czy jest to ograniczenie NHibernate lub używanie Guidsa jako klucza głównego?

Ten answer sugeruje, że musisz ustawić rodzica manully, czy to naprawdę jedyny sposób?

Oto moje mapowania dla odniesienia: mapowanie

nadrzędny:

HasMany(x => x.Children).KeyColumn("ParentKey").Inverse().Cascade.All(); 

mapowanie dziecka:

References(x => x.Parent).Not.Nullable().Column("ParentKey"); 

Odpowiedz

15

NHibernate nie jest magia. To jest tylko ORM, jeśli twoje dzieci nie mają swojego zestawu referencyjnego do rodzica, to dlaczego miałoby to zakładać, ponieważ rodzic ma listę dzieci, z których odniesienie dla dzieci POWINNO być referencją do rodzica?

Wydaje mi się, że odpowiedziałeś na własne pytanie, gdy stwierdziłeś, że elementy podrzędne nie mają wypełnionej właściwości rodzica (co oznacza, że ​​jest ona zerowa, co oznacza, że ​​NHibernate będzie próbował zapisać wartość "null" dla identyfikatora nadrzędnego w tabeli Dziecko).

Jeśli używałeś tych obiektów BEZ NHibernate, miałoby to sens, że odniesienie dla Rodzica musi zostać ustawione na elementach Podrzędnych, kiedy są one dodawane.

EDIT: To jest dla przypadku, w którym został określony „Inverse” na mapowanie. Jeśli chcesz usunąć to połączenie do "Odwrotnie",, powinno działać tak, jak chcesz, aby działało jako Odwrotna stwierdza, że ​​inny koniec(jednostka podrzędna) jest odpowiedzialny za śledzenie relacji. Oznacza to, że musisz ręcznie ustawić odniesienie do rodzica na dziecku.

Jednak usunięcie instrukcji Odwrotnej spowoduje zapisanie elementu potomnego, zapisanie elementu nadrzędnego, a następnie nadanie identyfikatora nadrzędnego elementu Dziecko (dziecko) AKTUALIZOWANIU. Ponieważ masz ograniczenie null dla identyfikatora nadrzędnego, oznacza to, że nadal nie będzie działać tak, jak początkowo wstawił element potomny o identyfikatorze nadrzędnym o wartości null.

Oba rozwiązania byłoby albo usunąć to ograniczenie, albo po prostu dodaj metodę Dominującej zwanego addChild:

public void AddChild(Child childObj) 
{ 
    childObj.Parent = this; 
    Children.Add(childObj); 
} 

Dodaj inną metodę o nazwie removeChild:

public void RemoveChild(Child childObj) 
{ 
    if (Children.Contains(childObj)) 
    { 
     Child.Parent = null; 
     Children.Remove(childObj); 
    } 
} 

Następnie użyj tych metod do dodawania/usuwania elementów podrzędnych.

+1

Oczywiście nie oczekuję, że referencja będzie tam w czasie wykonywania przed zapisaniem (być może moje pytanie jest mylące, źle to edytuj) - Spodziewam się, że Nhibernate dowie się, że zarówno rodzic, jak i dzieci są nowi, i wiedzieć, jak utrzymać je przy pomocy odpowiednich kluczy ... za dużo, aby zapytać? – Dan

+0

@Dan Zaktualizowałem moją odpowiedź, aby była bardziej pomocna. – docmanhattan

+0

tylko po to, aby wyjaśnić więcej dla odwzorowań i ograniczeń Sprawdź ten link http://wiki.fluentnhibernate.org/Fluent_mapping#Access_strategies – cpoDesign

Powiązane problemy