ORM и генераторы кода находятся на одной стороне поля, а хранимые процедуры - на другой. Как правило, проще использовать ORM и генераторы кода в новых проектах, потому что вы можете настроить схему базы данных в соответствии с созданной моделью домена. Гораздо сложнее использовать их в унаследованных проектах, потому что, как только программное обеспечение написано с мышлением «сначала данные», его трудно обернуть моделью предметной области.
При этом все три подхода имеют ценность. Хранимые процедуры проще оптимизировать, но может быть заманчиво поместить в них бизнес-логику, которая может повторяться в самом приложении. ORM работают хорошо, если ваша схема соответствует концепции ORM, но может быть трудно настроить, если нет. Генераторы кода могут быть хорошим посредником, потому что они предоставляют некоторые преимущества ORM, но позволяют настраивать сгенерированный код - однако, если вы привыкли изменять сгенерированный код, у вас возникнут две проблемы, потому что вы придется изменять его каждый раз, когда вы заново его генерируете.
Единственного правильного ответа не существует, но я больше склоняюсь к стороне ORM, потому что считаю, что имеет больше смысла думать с объектно-ориентированным мышлением.