Как избежать множественного создания классов в c# web api?
Вообще у Вас все правильно. Есть слой моделей, которые являются сущностями, есть слой моделей, которые для отображения данных, есть слой dto моделей. У меня в проектах тоже всегда так. Зря Вы думаете, что плодите их, они находятся в разных слоях (модулях), можете считать их разными доменными моделями. Для больших и сложных проектов, это оправдано. И хоть все классы со стороны могут показаться одинаковыми, но они разные, т.к. относятся к разным доменным моделям и выполняют разную функцию.
Если у Вас проект небольшой, то можно было обойтись и одним слоем для работы с ORM и не усложнять код.
Один класс на одну сущность и репозиторий