Я собираюсь внести свои 2 цента на этом. Ваш уровень доступа к данным должен скрывать реализацию всех хранилищ данных: баз данных, файлов, вызовов внешних API.
Ваш BL никогда не должен напрямую использовать DbContext и даже не должен ничего знать о его существовании; потому что это делает ваш BL зависимым от детали реализации, которая тесно связывает ваш BL с вашим DAL ...
Что если вы решите больше не использовать Entity Framework?
Что если вы хотите включить другие хранилища данных, такие как json файлы или обращения к внешним интерфейсам API?
Вы видите, что вызов DbContext из вашего BL отрицает цель многоуровневой архитектуры.
Не говоря уже о том, что он нарушает несколько принципов SOLID design.
В действительности в профессионально спроектированном программном обеспечении ваш BL будет взаимодействовать с DAL через интерфейсы в слабосвязанной форме. BL не будет знать никаких подробностей реализации хранилищ данных и не будет заботиться о том, откуда берутся данные. Это будут просто объекты, возвращающиеся с периода DAL.
Кроме того, используя DbContext непосредственно из своего BL, вы смешиваете доступ к данным с бизнес-логикой c, которая нарушает инкапсуляцию и единственную ответственность.
Если вы разделяете и инкапсулируете свой DAL, вы можете добавить любое хранилище данных без необходимости переосмысления уровня бизнес-логики c.