Использование нескольких ошибок получения DbContext Невозможно использовать несколько экземпляров DbContext в рамках одного выполнения запроса - PullRequest
0 голосов
/ 23 октября 2019

Я запустил новое приложение MVC, используя .NET Core 3. У меня есть три файла DbContext, которые используют три разные базы данных: ComplaintDbContext для моего основного приложения, IdentityCoreDbContext для пользователей Identity и EmployeeDbContext для моей базы данных сотрудников.

В моем приложении у меня есть класс репозитория ComplaintRepository, и конструктор выглядит так:

public ComplaintRepository(ComplaintDbContext context, 
        EmployeeDbContext employeeContext)
    {
        _context = context;
        _employeeContext = employeeContext;
    }

В моем ComplaintController мне нужно получить данные из обеих баз данных. Я могу получить свои данные из своей базы данных жалоб, но как только я вызываю свое действие, которое получает данные из моей базы данных сотрудников, я получаю сообщение об ошибке:

Невозможно использовать несколько экземпляров DbContext в рамках одного выполнения запроса. Убедитесь, что запрос использует один экземпляр контекста.

Я пробовал что-то вроде этого:

public class FrameworkContext : DbContext
{
    public DbSet<Customer> Customers { get; set; }
}

public class ExtendedContext : FrameworkContext
{
    public DbSet<Order> Orders { get; set; }
}

Я не могу заставить его работать. Любая помощь будет оценена. Спасибо!

Редактировать:

Я создал новый репозиторий EmployeeRepository для разделения проблем. Вот мое действие, которое вызывает у меня проблемы:

    public IEnumerable<ApplicationUser> GetWorkerList()
    {
        var employees = _employeeRepository.GetEmployeesByUnit(22);

        //Get ApplicationUsers where user exists in Employees list
        IEnumerable<ApplicationUser> userList = _userManager.Users
            .Where(emp => employees.Any(e => emp.EmployeeID == e.EmployeeId)).OrderBy(e => e.LastName);

        return userList;            
    }

Моя база данных Employee и моя база данных Identity совместно используют столбец EmployeeId.

Когда я пытался изменить его на использование ToList (), яначал получать другую ошибку:

InvalidOperationException: выражение LINQ 'Где (источник: DbSet, предикат: (a) => Любой (источник: (необработанный параметр: __employees_0), предикат: (e) => a.EmployeeID == e.EmployeeId)) 'не может быть переведено. Либо переписайте запрос в форме, которую можно перевести, либо переключитесь на оценку клиента явно, вставив вызов либо в AsEnumerable (), AsAsyncEnumerable (), ToList (), либо в ToListAsync ().

Редактировать:

Я воспользовался рекомендацией Тао Чжоу об использовании ToList () и смог заставить его работать. Я заменил IEnumerable в своем репозитории, чтобы использовать это:

    public List<TblEmployee> GetEmployeesByUnit(int unitId)
    {
        var emp = _context.TblEmployee.Where(e => e.UnitId == unitId &&
                e.TermDate == null)
            .OrderBy(e => e.LastName).ToList();

        return emp;
    }

В моем контроллере я в основном сделал то же самое, и теперь у меня есть это:

    public List<ApplicationUser> GetWorkerList()
    {
        var employees = _employeeRepository.GetEmployeesByUnit(22);

        List<ApplicationUser> userList = new List<ApplicationUser>();

        //Get ApplicationUsers where user exists in Employees list
        foreach (TblEmployee emp in employees)
        {
            ApplicationUser user = _userManager.Users
                .Where(e => e.EmployeeID == emp.EmployeeId).FirstOrDefault();

            userList.Add(user);
        }

        return userList;            
    }

Я хотел бы использовать LINQ вместоцикл foreach.

...