В нашей бизнес-логике мы иногда определяем методы примерно так:
User.ResetCourse(Course courseToReset)
Проблема в том, что и Пользователь, и Курс являются объектами прокси Entity Framework. Это означает, что когда мы обращаемся к свойствам навигации для пользователя или курса, это может привести к огромному удару по базе данных, поскольку эти объекты не являются IQueryable, поэтому он проходит через них в обычном режиме.
Чтобы решить эту проблему, мы изменили подпись:
User.ResetCourse(MyDBContext db, Course courseToReset)
Это означает, что мы можем напрямую запрашивать базу данных для эффективного внесения необходимых изменений, но передача контекста базы данных в бизнес-объект кажется просто неправильной.
Позже мы перешли на уровень сервиса пользователя, что означает, что у нас есть что-то вроде:
CourseService.ResetForUser(Course courseToReset, User forUser)
Эта служба имеет ссылку на DBContext, внедренный при создании, но теперь наши бизнес-объекты - это просто пакеты данных без поведения (т. Е. Модель анемичного домена).
Как мы можем избежать этого?