Расскажу из личного опыта:
Мне всегда хочется, чтобы модель, которая используется в БД, и модель, которая используется в контроллере, были одной и той же моделью.
Все просто же: пришёл запрос в контроллер - сохрани в бд; нужно что-то из бд - сделай селект и отправь в контроллер.
Но никогда, ни разу это не было хорошей идеей.
Начнём с того, что как только появляется хоть какая-то вложенность объектов, никто в здравом уме не будет в контроллере передавать эти объекты, ограничиваясь ссылками на них, в лучшем случае (используя их id); закончим вопросами безопасности и консистентности данных, которые сразу, мимо валидации и какого-то сервиса отправляются в бд.
Отвечаю на ваш вопрос:
1. Всегда используйте сервис. Умение сохранять объекты в бд у контроллера противоречит принципу solid
2. Используйте луковую архитектуру. Доменная модель не должна ничего знать о внешних интеграциях.