Deleting Collections

As it was discussed in Deleting Structured Objects chapter, deleting a top-level object does not mean deleting all of the member objects. The same rule applies for collections. The recommendation would be to use cascadeOnDelete setting for a collection, which should be deleted with all its members.

For the following example we will use DataObject and ListObject classes. The database will be filled up with the FillUpDb method.

ListDeletingExample.cs: DeleteTest
01private static void DeleteTest(){ 02 // set cascadeOnDelete in order to delete member objects 03 IConfiguration configuration = Db4oFactory.NewConfiguration(); 04 configuration.ObjectClass(typeof(ListObject)).CascadeOnDelete(true); 05 IObjectContainer db = Db4oFactory.OpenFile(configuration , Db4oFileName); 06 try 07 { 08 IList<ListObject> result = db.Query<ListObject>(typeof(ListObject)); 09 if (result.Count > 0) 10 { 11 // retrieve a ListObject 12 ListObject lo1 = result[0]; 13 // delete the ListObject with all the field objects 14 db.Delete(lo1); 15 } 16 } finally { 17 db.Close(); 18 } 19 // check ListObjects and DataObjects in the database 20 db = Db4oFactory.OpenFile(Db4oFileName); 21 try { 22 IList<ListObject> listObjects = db.Query<ListObject>(typeof(ListObject)); 23 Console.WriteLine("ListObjects in the database: " + listObjects.Count); 24 IList<DataObject> dataObjects = db.Query<DataObject>(typeof(DataObject)); 25 Console.WriteLine("DataObjects in the database: " + dataObjects.Count); 26 } finally { 27 db.Close(); 28 } 29 }
ListDeletingExample.vb: DeleteTest
01Private Shared Sub DeleteTest() 02 ' set cascadeOnDelete in order to delete member objects 03 Dim configuration As IConfiguration = Db4oFactory.NewConfiguration() 04 configuration.ObjectClass(GetType(ListObject)).CascadeOnDelete(True) 05 Dim db As IObjectContainer = Db4oFactory.OpenFile(configuration, Db4oFileName) 06 Try 07 Dim result As IList(Of ListObject) = db.Query(Of ListObject)(GetType(ListObject)) 08 If result.Count > 0 Then 09 ' retrieve a ListObject 10 Dim lo1 As ListObject = result(0) 11 ' delete the ListObject with all the field objects 12 db.Delete(lo1) 13 End If 14 Finally 15 db.Close() 16 End Try 17 ' check ListObjects and DataObjects in the database 18 db = Db4oFactory.OpenFile(Db4oFileName) 19 Try 20 Dim listObjects As IList(Of ListObject) = db.Query(Of ListObject)(GetType(ListObject)) 21 Console.WriteLine("ListObjects in the database: " + listObjects.Count.ToString()) 22 Dim dataObjects As IList(Of DataObject) = db.Query(Of DataObject)(GetType(DataObject)) 23 Console.WriteLine("DataObjects in the database: " + dataObjects.Count.ToString()) 24 Finally 25 db.Close() 26 End Try 27 End Sub
Please, remember that there is no referential integrity check on delete: deleted objects might be referenced from elsewhere in your code.