Объясните как правильно применять паттерн Repository с Entity Framework?
зачем нужно делать свой repository на каждую сущность
Не на каждую сущность а только для сущностей, которые выступают корнями агрегатов сущностей. Ну то есть если у вас есть сущность Product и ProductImage к примеру, то репозиторий вы делаете только для продуктов.Почему нельзя использовать шаблон Repository для работы с несколькими сущностями сразу
Потому что репозиторий представляет некую штуку, которая отвечает за хранение вещей. Например представьте что репозиторий это полка. У вас есть полка для одних штук, полка для других.
Причем полки эти могут содержать различные бизнес правила вдухе "пользователь не может положить на полку больше N продуктов пока не заплатит дополнительную деньгу".
И для каждой сущности будут свои правила как и кто может их где хранить. Банальное соблюдение принципа единой ответственности и разделения обязанностей.
Репозиторий - Это обертка над коллекцией элементов в памяти. Нужны методы Add, Remove, Get(id), GetAll, Find(predicate). Здесь не должно быть методов сохранить, редактировать т.к. для этого нам достаточно просто взять элемент из коллекции и изменить его. Репозиторий не должен знать о базе данных.
Unit of work - Представляет список объектов изменных бизнес транзакциями, координирует запись этих изменений.
Если просто взять элемент недостаточно - делают сервис, который уже знает что и с чем и как сохранять. Не надо делать репозитории для каждой сущности, достаточно 1-го Generic.
https://www.youtube.com/watch?v=rtXpYpZdOzM
https://www.youtube.com/watch?v=QwwfTWMrM9k
Другой подход это DDD, в нем нет репозиториев и unitofwork. Но его сложнее делать и не сразу доходит.