2010-11-26 3 views
2

Ich habe Mapping für A- und B-Klassen, wobei 'eine' Seite A ist und 'viele' Seite B. B Referenzen A wo Fremdschlüssel nicht nullbar ist. Mapping von A als Cascade.Delete() für B mit FluentNH. Wenn ich versuche, A zu löschen, versucht NHibernate, B zu aktualisieren und den Fremdschlüssel auf null zu setzen. Es tritt also ein Fehler auf, da der Fremdschlüssel nicht nullfähig ist.NHibernate Problem in der 1: n-Beziehung löschen

Was soll ich tun? Machen Sie den Fremdschlüssel NULL-fähig?

EDIT: Wenn ich den Fremdschlüssel auf NULL einstellbar, funktioniert es. Aber ist das der richtige Weg?

Antwort

4

Eine andere Lösung stieß ich auf die folgende:

HasMany(a => a.B).Cascade.AllDeleteOrphan().Inverse(); 

Sie benötigen DeleteOrphan, wenn Sie möchten, dass aBClear() alle Bs löscht.

EDIT: Wie Sie nur Cascading löschen sind, hier ist es für nur löschen:

HasMany(a => a.B).Cascade.Delete().Inverse(); 

Das inverse Attribut sagt, dass von A für das Verhältnis zu B, es ist die Inverse von A (dh B) das die Beziehung besitzt (es hat den FK in der Datenbank). Sie können mehr über inverse lesen Inverse Attribute in NHibernate

0

Es ist schwierig, dies ohne Kontext zu beantworten.

In der Problemdomäne ist es gültig, ein B zu haben, das kein A hat?

Wenn ja, könnte der Fremdschlüssel nullfähig sein.

Wenn nicht, müssen Sie eine Möglichkeit finden, alle Bs zu löschen, wenn das übergeordnete A gelöscht wird.

1

Dies liegt daran, dass NHibernate versucht, die Fremdschlüsselspalte für die Datensätze auf null zu setzen, da jedoch Nullen in dieser Spalte nicht zulässig sind, löst der Datenbankserver den Fehler aus. Versuchen Sie, verwenden .Cascade.AllDeleteOrphan() anstelle von Cascade.Delete():

In der A-Mapping-Klasse:

HasMany(x => x.B) 
     .Inverse() 
     .Cascade.AllDeleteOrphan() 
     .KeyColumn("foreignKeyID"); 
+0

Ich denke, Ihre Lösung wird funktionieren, aber wegen der Inverse(), nicht AllDeleteOrphan(). Ich habe es mit Cascade.Delete() versucht und es funktioniert. – Iain