Selfservicing's Save() method isn't recursive. If a save is recursive, all objects in the tree will be saved and what's better: a transaction will be created for you if it's not there.
So you shouldn't override OnSave() as that's called when the save action is in progress. What you should do is override:
Save(IPredicate updateRestriction, bool recurse)
This method is defined in the generated _entityName_EntityBase class.
In that override, you add the code for clearing/new item addition to the collection, and IF you needed to to so, you simply pass true for recurse when calling the base method. .
I'm not sure if you also wanted to perform the deletes, which I think you want to. If you also want to issue the deletes, copy the code from the base' Save method over to your override and which means you start the transaction IF necessary, locally in your override. As the code in the base method checks if a new transaction is necessary, this will work OK.