2013-07-29 6 views
16

Wie ich verstehe, wenn ich eine übergeordnete Zeile lösche, sollten seine Kinder gelöscht werden, wenn ich beim Löschen kaskadieren. Von meinen Tests scheint es jedoch überhaupt nicht zu funktionieren. Egal, ob ich WillCascaseOnDelete auf true oder false setze, es setzt einfach den Fremdschlüssel seiner Kinder auf null. Dies verursacht ein weiteres Problem, dass ich den Fremdschlüssel Null schreiben muss, sonst wird SaveChange Ausnahme auslösen. Ist das ein Defekt oder ein gewünschtes Verhalten?Wie funktioniert WillCascadeOnDelete in Entity Framework?

Antwort

12

Dies liegt daran, dass Ihre Fremdschlüssel (untergeordnet) nullfähig sind. Wenn der Fremdschlüssel in der Beziehung Nullwerte enthält, löscht EF beim Löschen des übergeordneten Elements standardmäßig das übergeordnete Element und setzt den Fremdschlüssel auf null. Wenn der Fremdschlüssel NICHT NULL ist, löscht er das Kind (das Verhalten, nach dem Sie suchen?).

Sie dieses Standardverhalten here

+3

Ich habe das gleiche Problem, mein Fremdschlüssel wird als 'IsRequired();' festgelegt, die Beziehung hat '.WillCascadeOnDelete (true)', aber ich bekomme immer noch eine Ausnahme beim Versuch, das Elternobjekt zu löschen. –

+0

@UwConcept, würde ich erwarten, dass eine Ausnahme ausgelöst wird, wenn Sie die Fremdschlüsselbeziehung als 'IsRequired();' angegeben haben, da Entity Framework den Wert nach dem Entfernen des übergeordneten Objekts nicht auf 'null' setzen kann. – weenoid

+3

@weenoid Danke für Ihre Antwort. Aber wäre es nicht sinnvoller, das untergeordnete Objekt zu löschen, anstatt einen NULL-Wert in einem nicht nullbaren Feld zu setzen? Nur meine zwei Cent. –

0

Stellen Sie sicher, auf der Fremdschlüsselbeziehung Fenster in SQL Server ändern können, haben Sie Cascade als Delete Regel ausgewählt.

Verwandte Themen