2010-05-12 8 views
5

Dawka nHibernate dobrze gra z kasowaniem baz danych na poziomie? Mam na myśli to, że jeśli mam zestaw ograniczeń na poziomie RDBMS, aby kaskada usunąć wszystkie sieroty, czy nHibernate wywoła dowolną niestandardową logikę usuwania na poziomie aplikacji, jeśli mam usunąć obiekt za pomocą nHibernate? Czy powinienem usunąć usuwanie kaskadowe z poziomu RDBMS i po prostu użyć funkcji usuwania kaskadowego nHibernate, definiując to zachowanie, chociaż jego konfigurację?NHibernate - czy działa dobrze z usuwaniem kaskadowym na poziomie baz danych na obcym kluczowym ograniczeniu

Dzięki

Odpowiedz

5

NHibernate po prostu traktuje RDBMS jako magazynu danych. W większości przypadków oznacza to, że możesz pozwolić NHibernate wykonać pracę za Ciebie.

Niech NHibernate usunie kaskadowanie. W ten sposób można zachować logikę i kontrolę w miejscu, w którym się znajduje (w aplikacji), a nie w bazie danych, w której aplikacja ma niewielką kontrolę lub elastyczność.

EDIT:

ON DELETE CASCADE nie zawsze wykazują wysoką wydajność z NHibernate. Musisz bardzo uważać, jakie ustawienia kaskadowe twoich powiązań kolekcji są ustawione. Zobacz ten artykuł: http://eddii.wordpress.com/2006/11/16/hibernate-on-deletecascade-performance/

O ile wydajność nie jest dla ciebie dużym problemem, generalnie czystsze i mniej problematyczne jest, aby NHibernate mógł wykonać pracę. Jamie Ide słusznie zauważa:

Jak z wyzwalaczy, NHibernate nie będą wiedzieć, że reprezentacja w bazie obiektu uległa zmianie na skutek operacji bazy danych. Unikałbym korzystania z nich z tego powodu w większości przypadków .

+1

To jest nieoptymalne. NHibernate wie o usunięciu CASCADE'a (patrz odpowiedź dotjoe) i może go użyć dla lepszej wydajności (bez konieczności usuwania poszczególnych dzieci DELETEs przy usuwaniu rodzica) –

2

Może pracować z kaskadami poziomu bazy danych. Możesz zadeklarować je w odwzorowaniu, więc narzędzie hbm2ddl wygeneruje on delete cascade. Ta opcja znajduje się we właściwości kolekcji key.

<bag ...> 
    <key column="someId" on-delete="cascade" /> 
... 
</bag> 
+0

jakikolwiek sposób na ustawienie 'on-update'? –

1

To zależy co masz na myśli przez „grać dobrze”. Możesz używać kaskadowych kasowań przy pomocy NHibernate, ale musisz uważać, aby odświeżyć obiekty, na które mogą mieć wpływ kaskadowe usuwanie. Podobnie jak w przypadku wyzwalaczy, NHibernate nie będzie wiedział, że reprezentacja bazy danych obiektu uległa zmianie z powodu operacji bazy danych. W większości przypadków unikałbym ich używania z tego powodu.

Powiązane problemy