EF4 - Löschen von Objekten

23/04/2010 - 10:16 von Holger | Report spam
Hallo NG,

ich teste gerade alle möglichen Situationen mit EF4, um validieren zu
können, ob wir das einsetzen wollen. Leider bleibe ich stàndig hàngen.
Aktuell habe ich das Problem, dass sich ein Objekt nicht löschen
làsst:

Ich habe drei Entitàten: Root, Parent und Child (Root:Parent = 1:n,
Parent:Child = 1:n). Ziel ist es, eine n-Tier-app zu schreiben. Ich
lade also in einer BusinessFacade die Daten und geben sie ohne Kontext
an den client zurück. Ich arbeite mit SelfTrackingEntities.

Im Client habe ich nun den Graphen Stück für Stück aufgebaut. Ich habe
eine Speichern-Methode in der BusinessFacade, die immer nur den root
erhàlt und selbst herausfinden soll, was sich geàndert hat:

public static void SaveRoot(Root root)
{
using (Model1Container container = new Model1Container())
{
container.RootSet.ApplyChanges(root);
container.SaveChanges();
}
}

Der Graph ließ sich wunderbar Stück für Stück aufbauen - also erst ein
Root, dann diesen holen und ein Parent dranhàngen, dann ein child,
dann noch ein child, etc.

Der nàchste Versuch war, ein Child zu löschen - einfach das erste.
Hier der Code dafür:

private void button1_Click(object sender, RoutedEventArgs e)
{
Root root = LocalBusinessFacade.GetRoot();
Parent parent = root.Parent.FirstOrDefault<Parent>();
Child child = parent.Child.First<Child>();
child.MarkAsDeleted();
LocalBusinessFacade.SaveRoot(root);
}

child.markedAsDeleted() löscht auch das aktuelle child aus dem
ChildSet von Parent. Leider wird das durch die SaveRoot()-Methode
völlig ignoriert ==> in der DB wird nichts gelöscht; beim nàchsten
Select habe ich wieder gleich viele Childs.

Was mache ich falsch??

Danke & Grüße
Holger
 

Lesen sie die antworten

#1 Holger
23/04/2010 - 11:47 | Warnen spam
Ok - habe es selbst herausgefunden:

bei den Self-Tracking-Objects muss man irgendwann mal StartTracking()
gerufen haben. Eigentlich wollte ich eine mehrschichtige Anwendung
machen, habe aber erstmal lokal mit einer BusinessFacade in einer
ClassLib getestet. Dann aber muss man StartTracking explizit aufrufen.
Arbeitet man in einem anderen Tier, wird StartTracking beim
Deserialisieren aufgerufen - für mich also implizit.

Das war die Lösung... (und es stand auch irgendwo, man muss es nur
finden und in dem moment verstehen :o) )

Grüße
Holger

Ähnliche fragen