Я запустил новое приложение 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.