I've tried folowing and it looks like kind of working solution. Not sure if it is correct, but anyway.
I'm using UnitOfWork2. I have UnitOfWork2Adapter - own class that wraps UnitOfWork2 and exposes part of its interface.
My UnitOfWork2Adapter have AddForDelete method that is basically calls UnitOfWork2.AddForDelete.
I modified it in a following manner:
public void AddForDelete(IEntity2 entity)
{
if (entity is ActivityEntity activity)
{
_activitiesToDelete.Add(activity);
}
else
{
_unitOfWork2.AddForDelete(entity);
}
}
As you may notice, I introduced separate queue for deleting activity entities (the one that I want to delete in a custom way).
I used UnitOfWork2 callbacks to delete entities from DB:
_unitOfWork2.AddCallBack((Action<IDataAccessAdapter>)DeleteActivitiesFromDbViaStoredProcedureCall, UnitOfWorkCallBackScheduleSlot.PostEntityDelete, true);
And there is an implementation of DeleteActivitiesFromDbViaStoredProcedureCall:
private void DeleteActivitiesFromDbViaStoredProcedureCall(IDataAccessAdapter dataAccessAdapter)
{
foreach (var activity in _activitiesToDelete)
{
ActionProcedures.PDeleteFromActivity(activity.ActivityID, dataAccessAdapter);
}
_activitiesToDelete.Clear();
}
In order to make LlblGen not to delete these entities, I've used UnitOfWork2.RemoveFromUoW:
_unitOfWork2.AddCallBack((Action)RemoveDeletingActivitiesFromUow, UnitOfWorkCallBackScheduleSlot.PreEntityInsert, false);
...
private void RemoveDeletingActivitiesFromUow()
{
foreach (var activity in _activitiesToDelete)
{
UnitOfWork2.RemoveFromUoW(activity);
}
}
Now I'm testing this solution. It looks a bit... custom. Not sure if I'll go with it into production.