2009-05-30 2 views
4

Ich verwende das Ado.Net Entity Framework mit ASP.NET MVC.ADO.NET Entity Framework: Wie erhalten Sie automatische kaskadierende Löschungen?

In meiner MSSQL 2008-Datenbank Ich habe zum Beispiel der folgenden vereinfachten Tabellen und Beziehungen:

(Song) 1--* (Version) 1 -- 1 (VersionInfo) 

Ist es möglich, die verknüpften Versionen und ihre Version gelöschten automatisch, wenn ich einen Song löschen?

Derzeit bin ich so etwas wie den folgenden Code, der eine viel Handarbeit ist, da einige Tabellen bis zu 8 Beziehungen haben und diese Beziehungen haben subrelations auch manchmal:

db = new Database() //Entities 
    Song song = db.Song.First(); 

    Song.Version.Load(); 

    foreach(Version version in Song.Version.ToList()) 
    { 
     //Remove Song-Version Reference. 
     song.Version.Remove(version); 


     //Get The VersionInfo so we can delete it after we deleted the Version object. 
     version.VersionInfoReference.Load(); 
     VersionInfo versionInfo = version.VersionInfo; 

     //Now we can delete the Version Object. 
     db.DeleteObject(version); 
     //Now we can also delete the versionInfo, since the reference is gone. 
     db.DeleteObject(versionInfo); 

    } 

    db.DeleteObject(song); 

Es muss ein einfacher Möglichkeit, kaskadierende Löschungen zu erhalten. Ich habe bereits versucht, die Beziehung Einstellung in MSSQL auf Cascade beim Löschen zu setzen, aber es hat nichts gemacht ... Habe ich da etwas verpasst?

Wie auch immer, wie lösen andere Leute dieses Problem?

Antwort

2

Sie sollten dies nicht im Entity Framework tun. Alle gängigen relationalen Datenbanken unterstützen ON CASCADE DELETE auf Fremdschlüsseln, die auch viel effizienter ist. Ich schlage vor, Sie gehen nur damit.

Es erscheint in Ihrem Fall, dass Sie Löschungen in Song auf Version kaskadieren müssen und löscht in Version auf Versionsinfo. Laden Sie einfach den Tabellendesigner in SQL Manager und Sie sollten die relevanten Optionen unter Beziehungen sehen.

0

Wenn Sie es richtig in der Datenbank einstellen, sollte es definitiv die Löschungen kaskadieren. Ich denke, dass sie dies in der nächsten Version des Entity Framework verbessert haben, aber ich bin mir nicht sicher. Ich erinnere mich nur daran, irgendwo Kaskaden gesehen zu haben. Ich würde empfehlen, dass Sie erneut in die Datenbank schauen.

Zum Beispiel, gibt es noch andere Beziehungen, die auch kaskadiert werden müssen?

1

Ich versuchte es mit einer einfacheren Datenbank, 2 Tabellen und fand heraus, dass Kaskade nur von der 1 Seite eines 1-many ist.

table A 
id - int 
b_id - int 

table B 
id - int 

Die Beziehung wird zwischen A.b_id und B.id gesetzt. Regel löschen ist Kaskade.

Wenn ich A lösche, wird B nicht gelöscht. Wenn ich B lösche, wird A gelöscht.

Problem ist, ich möchte B gelöscht haben, wenn ich A lösche. Ich denke, das ist nur manuell möglich.

+0

Ja. Wenn Sie A löschen, kann B immer noch ohne Probleme existieren. Wenn Sie jedoch B löschen, kann A nicht existieren (weil es auf B zeigt, das nicht mehr existiert). Kaskadierte Löschvorgänge treten nur auf, wenn das Löschen eines Elements (B) dazu führt, dass ein anderes Element (A) inkorrekt ist oder eine Fremdschlüsseleinschränkung verletzt. – Flater

0

Wählen Sie im RTM von EF eine Beziehung im Designer aus und drücken Sie F4, um die Eigenschaften anzuzeigen. Sie sehen zwei OnDelete-Eigenschaften (eine für jede Seite der Beziehung), die auf "none" gesetzt sind. Sie können beide Seiten auf "Kaskade" setzen (ich denke, Sie müssen es auf die Eltern setzen)