db4o Developer Community

db4o open source object database, native to Java and .NET
Welcome to db4o Developer Community Sign in | Join
in Search
More Search Options

Objekte aus untergeordneter Liste löschen

Last post 07-23-2008, 05:08 AM by janb. 6 replies.
Sort Posts: Previous Next
  •  07-21-2008, 06:57 AM 50242

    Objekte aus untergeordneter Liste löschen

    Hallo @all,

    ich habe mich am Wochenende das erste mal ein wenig mit db4o beschäftigt. Dabei bin ich gleich zu Beginn auf ein Problem gestossen, das ich so auf die schnelle nicht lösen konnte, ich bin mir aber sicher, das die Lösung ganz einfach ist.

     Die Problemstellung ist folgende: Ich habe eine Klasse Company mit einer Eigenschaft Employees, die eine List<Employee> Klasse ist.

    Ich lege jetzt ein neues Company Objekt an und füge diesem gleich mal ein neues Employee Objekt über die Employees Liste hinzu. Danach speichere ich alles mit db.Store(company). Wenn ich die Datenbank jetzt neu initialisiere und mir das company Objekt neu hole, dann ist in der Liste der Employees auch der eine Mitarbeiter drinn. So weit so gut. Wenn ich jetzt aber diesen Mitarbeiter aus der Liste lösche und dann wieder das company Objekt speichere, dann ist der Mitarbeiter beim nächsten mal wieder drinn. Das war jetzt nicht so gut. Also dachte ich mir, muss ich den Mitarbeiter mit db.Delete(employee) explizit löschen. Das hatte jetzt aber den Effekt, das beim nächsten Laden die Liste der Employees immer noch einen Eintrag hatte, aber dieser war jetzt null. Und das war überhaupt nicht das was ich wollte.

    Was ich jetzt nicht probiert habe ist, nach dem Löschen aus der Liste db.Store(company.Employees) aufzurufen. Das fände ich aber jetzt auch nicht wirklich so gut, das machen zu müssen, oder?

     Wie kann ich das Problem lösen? Vielen Dank im voraus für Eure Hilfe! 

     


    Beste Grüße

    Jan
  •  07-21-2008, 07:33 AM 50243 in reply to 50242

    Re: Objekte aus untergeordneter Liste löschen

    Hi,

    guck Dir mal die entsprechenden Abschnitte in der Doku an. Stichwort für Dich ist insbesondere UpdateDepth:

    http://developer.db4o.com/Resources/view.aspx/Reference/Object_Lifecycle/Working_With_Structured_Objects

    Grüße, Maik


    http://db4o.blogspot.com/
  •  07-21-2008, 06:36 PM 50253 in reply to 50243

    Re: Objekte aus untergeordneter Liste löschen

    Vielen Dank für die schnelle Antwort. Leider hat sie mir nicht weitergeholfen. Ich habe 

     configuration.ObjectClass(typeof(Company)).CascadeOnUpdate(true); 

    aufgerufen. Trotzdem ist nach dem Löschen des Employees aus der Liste und dem Neuladen des Company Objektes wieder ein Null-Objekt in der Liste enthalten. Wie bekomme ich den Eintrag dauerhaft aus der Liste?

    Nachtrag: Ich habe jetzt zusätzlich db.Store(company.Employees); aufgerufen und siehe da. Jetzt ist der Eintrag aus der Liste verschwunden. 

    Ist das wirklich notwendig? Sollte dafür nicht eigentlich CascadeOnUpdate sorgen? Danke! 

      


    Beste Grüße

    Jan
  •  07-22-2008, 07:57 AM 50259 in reply to 50253

    Re: Objekte aus untergeordneter Liste löschen

    Hallo,

    db.Store(company.Employees) sollte eigentlich nicht nötig sein... kannst Du mal ein kleines (komplettes) Beispiel basteln? Daran sieht man meist recht schnell, wo genau Haken liegt.

    Danke, Maik


    http://db4o.blogspot.com/
  •  07-22-2008, 03:38 PM 50265 in reply to 50259

    Re: Objekte aus untergeordneter Liste l&#246;schen

    Attachment: db4oTest.zip

    Hallo Maik,

     

    ich habe das kleine Beispielprojekt bei diesem Beitrag mit hochgeladen. 


    Beste Grüße

    Jan
  •  07-22-2008, 06:31 PM 50267 in reply to 50265

    Re: Objekte aus untergeordneter Liste l&#246;schen

    Hi,

    ein schneller Blick offenbart vermutlich direkt das Problem: deine db4o-Konfiguration greift nämlich gar nicht...

    Du musst die Konfiguration zuerst erstellen und dann dem #OpenFile() übergeben, damti die Konfiguration einen Effekt hat. Bei Dir im Quellcode wird zwar nach dem Öffnen der Datenbank ein Konfigurationsobjekt gebastelt, dass verschwindet aber auch direkt wieder im Nimmerland des GarbageCollectors.

    Also vom Code her:

    IConfiguration configuration = Db4oFactory.NewConfiguration();
    configuration.ObjectClass(typeof(Company)).CascadeOnUpdate(true);
    configuration.ObjectClass(typeof(Company)).CascadeOnDelete(true);
    configuration.ObjectClass(typeof(Employee)).CascadeOnUpdate(true);
    configuration.ObjectClass(typeof(Employee)).CascadeOnDelete(true);

    IObjectContainer db = Db4oFactory.OpenFile(configuration, dbFileName); 

    Evtl. war es das ja schon, ansonsten müsste man nochmal genauer gucken.

    Grüße, Maik


    http://db4o.blogspot.com/
  •  07-23-2008, 05:08 AM 50275 in reply to 50267

    Re: Objekte aus untergeordneter Liste l&#246;schen

    Hallo Maik, vielen Dank für Deine Antwort. Was machst Du so früh schon am Rechner?

    Ich habe jetzt das configuration-Objekt bei OpenFile übergeben und siehe da, die Employees Liste wird jetzt wirklich geleert und bleibt es auch nach dem Neuladen des Containers.

    Leider war die Stelle, wo man das Configuration-Objekt übergeben muss, auch in den Beispielen, bei dem Link, den Du mir in Deiner ersten Antwort geschickt hattest, überhaupt nicht ersichtlich. Ich hatte mich schon gewundert, warum die Methode updatePilotSeparateSessionsImprovedPart1 ein IConfiguration Objekt zurückgibt, wenn es dann nirgendwo verwendet wird. Das könnte man in den Beispieler vielleicht noch etwas verbessern.

     

     

     

     


    Beste Grüße

    Jan
View as RSS news feed in XML