EF CORE 3.0 Невозможно использовать несколько экземпляров DbContext в рамках одного выполнения запроса - PullRequest
0 голосов
/ 03 ноября 2019

После обновления .Net Core 2.2 до 3.0 приложения выдают это сообщение об ошибке.

Cannot use multiple DbContext instances within a single query execution

Какой обходной путь?

IQueryable<ApplicationUser> query;

var queryJoin = from ci in _courseInstructorRepository.Table
        join uc in _userCourseRepository.Table on ci.CourseId equals uc.CourseId
        select new { ci, uc };

if (userId > 0)
    queryJoin = queryJoin.Where(x => x.ci.UserId == userId);

if (courseId > 0)
    queryJoin = queryJoin.Where(x => x.uc.CourseId == courseId);

if (classId > 0)
    queryJoin = queryJoin.Where(x => x.uc.CourseClassId == classId);

query = queryJoin.Select(x => x.uc.User).Distinct();

if (!string.IsNullOrEmpty(studentFirstChar))
    query = query.Where(x => x.FirstName.StartsWith(studentFirstChar));

if (schoolId > 0)
    query = query.Where(x => x.SchoolId == schoolId);

query = query.OrderBy(x => x.UserName);

return new PagedList<ApplicationUser>(query, pageIndex, pageSize);

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

В вашем коде есть несколько недостатков дизайна, которые EF core 2 скрыл под ковром.

  1. В ваших хранилищах нет общего экземпляра контекста. EF core 2 также не смог создать один SQL-запрос из вашего кода, но он молча переключился на оценку на стороне клиента. То есть он просто выполнил два SQL-запроса и соединил их в памяти. Это должно быть очень неэффективно. Одним из лучших проектных решений в EF core 3 было отказаться от автоматической оценки на стороне клиента, поэтому теперь вы получаете эту ошибку.

  2. Вы не используете свойства навигации. Использование ORM, такого как EF, вряд ли когда-либо понадобится вручную. Класс Instructor должен иметь свойство навигации, такое как Courses, и Course свойство навигации, такое как Instructor.

  3. Не используйте этот избыточный слой хранилища в любом случае. Поскольку вы уже знакомы с этим небольшим фрагментом кода, он обычно усложняет ситуацию без необходимости без какой-либо дополнительной ценности.

0 голосов
/ 03 ноября 2019

Одна из ваших переменных была создана с использованием другого экземпляра DBContext, поэтому, когда вы пытаетесь использовать его как часть запроса другого DBContext, он выбрасывает. Обходной путь - закрыть первый DBContext и вызвать DBContext.Attach (модель) для второго.

...