Using CSLA 3.8.1 here.
I'm trying to work out how to accomplish the following. I think I've just been looking at it too long, maybe someone here can point me in the right direction.
I have an editable root object, with a child collection, populated with child objects.. nothing special so far.
When the last child object is deleted, the root object should also be deleted.
So...when a developer uses my classes they end up with code like this:
(assume that there is only 1 item in the Details collection here)
Dim obj as TheRoot = TheRoot.Fetch(keyValue)
obj = TheRoot.Fetch(keyValue) <-- should return nothing (or blow up with "not found" exception) because the root has been deleted.
I'd argue that this should be handled by your Save logic.
Ie: override the Save method on obj and if
- obj.Detalis.Count == 0 and ((Core.IEditableCollection)obj.Details).GetDeletedList().Count > 0
then call obj.MarkDeleted()
before calling base.Save()
You could also add code in an override of OnChildChanged but what if the user deletes all children and then add 1 or more new child objects.
Would it be OK if the object has already been marked as Deleted?
Overriding Save looks like the ticket. Thanks, this'll work nicely
I was trying to work out how to this in the dataportal_xyz methods of the root but it seemed like i was going down the wrong path.
Just in case anyone needs this in VB.Net
Public Overrides Function Save() As rootClass
If Me.Details.Count = 0 Then
'if no details left
If DirectCast(DirectCast(Me.Details, Csla.Core.IEditableCollection).GetDeletedList, Csla.Core.MobileList(Of MyChildClass)).Count > 0 Then
'and we deleted at least one of the detail items...
'make sure the root object is tagged for deletion.
Copyright (c) Marimer LLC