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 IObjectContainer db = Db4oFactory.OpenFile(DbFile); 03 try 04 { 05 // set cascadeOnDelete in order to delete member objects 06 db.Ext().Configure().ObjectClass(typeof(ListObject)).CascadeOnDelete(true); 07 IList<ListObject> result = db.Query<ListObject>(typeof(ListObject)); 08 if (result.Count > 0) 09 { 10 // retrieve a ListObject 11 ListObject lo1 = result[0]; 12 // delete the ListObject with all the field objects 13 db.Delete(lo1); 14 } 15 } finally { 16 db.Close(); 17 } 18 // check ListObjects and DataObjects in the database 19 db = Db4oFactory.OpenFile(DbFile); 20 try { 21 IList<ListObject> listObjects = db.Query<ListObject>(typeof(ListObject)); 22 Console.WriteLine("ListObjects in the database: " + listObjects.Count); 23 IList<DataObject> dataObjects = db.Query<DataObject>(typeof(DataObject)); 24 Console.WriteLine("DataObjects in the database: " + dataObjects.Count); 25 } finally { 26 db.Close(); 27 } 28 }

ListDeletingExample.vb: DeleteTest
01Private Shared Sub DeleteTest() 02 Dim db As IObjectContainer = Db4oFactory.OpenFile(DbFile) 03 Try 04 ' set cascadeOnDelete in order to delete member objects 05 db.Ext.Configure.ObjectClass(GetType(ListObject)).CascadeOnDelete(True) 06 Dim result As IList(Of ListObject) = db.Query(Of ListObject)(GetType(ListObject)) 07 If result.Count > 0 Then 08 ' retrieve a ListObject 09 Dim lo1 As ListObject = result(0) 10 ' delete the ListObject with all the field objects 11 db.Delete(lo1) 12 End If 13 Finally 14 db.Close() 15 End Try 16 ' check ListObjects and DataObjects in the database 17 db = Db4oFactory.OpenFile(DbFile) 18 Try 19 Dim listObjects As IList(Of ListObject) = db.Query(Of ListObject)(GetType(ListObject)) 20 Console.WriteLine("ListObjects in the database: " + listObjects.Count.ToString()) 21 Dim dataObjects As IList(Of DataObject) = db.Query(Of DataObject)(GetType(DataObject)) 22 Console.WriteLine("DataObjects in the database: " + dataObjects.Count.ToString()) 23 Finally 24 db.Close() 25 End Try 26 End Sub

Please, remember that there is no referential integrity check on delete: deleted objects might be referenced from elsewhere in your code.