Вы должны обрабатывать транзакцию на уровне dataAccess как можно ближе к реальной транзакции ... Кроме того, ваши бизнес-объекты не должны иметь над ними операций вставки ...
Вы должны использовать свой DAL для сохранения и извлечения ваших бизнес-объектов. Таким образом, вы внедрили объект доступа к данным в свой бизнес-объект. Возможно, это только мое мнение ...
Мой другой комментарий - зачем ловить, если вы просто собираетесь бросить ... избавиться от этой ловушки ...
Лично я бы обернул конкретную конкретную «ошибку сохранения данных» в общую ошибку «не удалось сохранить данные» и вернул бы ее ... конечно, указав исходную ошибку во внутреннем исключении. Таким образом, если вы поменяете местами технологию доступа к данным и тип ошибки изменится, люди, улавливающие ошибку, все равно смогут перехватить ваш конкретный пользовательский тип ошибки и не потерять основную информацию об ошибке.
В тех случаях, когда вы хотите поймать, сделайте что-нибудь, а затем просто позвольте исходной ошибке всплыть ... используйте
throw; //and not throw ex;
Это предотвратит потерю трассировки стека