EntityFramework в .NetCore 3.1 и нескольких DBContext - PullRequest
0 голосов
/ 17 июня 2020

У меня "работает" приложение .NetCore 2.2. Мой клиент попросил внести некоторые изменения, и я решил попробовать перенести приложение на .NetCore 3.1. EntiryFramework меня устраивает.

У моего клиента есть несколько «баз данных» MS SQL, таких как «Персонал», «Резервирование», «Биллинг» и т. Д. c. Мне очень часто приходится создавать запросы, которые сопоставляют людей из отдела кадров с биллингами и / или другими записями из других БД. Я делаю подобные вещи сейчас в версии 2.2.

Если я запустил запрос, похожий на следующий, я получу исключение:

Cannot use multiple DbContext instances within a single query execution. Ensure the query uses a single context instance.

Этот запрос, похоже, использует единственный контекст, но есть это та devicesInRoom сущность, похороненная там. devicesInRoom относится к типу IQueryable<string> и исходит из "служебного" запроса, который я выполнял ранее. В основном я хочу ТОЛЬКО reservations, где reservations.Device совпадает с одним из элементов в devicesInRoom.

var reservations = (
    from reservation in reservationsContext.Reservations
    from reservationType in reservationsContext.Types.Where(
        reservationType => reservationType.Id.Equals(reservation.TypeId)
    ).DefaultIfEmpty()
    from roomMates in devicesInRoom
        .Where(
            roomMates => roomMates.Equals(reservation.Device)
        ).DefaultIfEmpty()
    where reservation.StartDate < viewEnd
          && reservation.EndDate > viewStart
          && reservation.Deleted.Equals(false)
    select reservation.Device
).ToList();

Если я перепишу этот запрос как:

var reservations = (
    from reservation in reservationsContext.Reservations
    from reservationType in reservationsContext.Types.Where(
        reservationType => reservationType.Id.Equals(reservation.TypeId)
    ).DefaultIfEmpty()
    where reservation.StartDate < viewEnd
          && reservation.EndDate > viewStart
          && reservation.Deleted.Equals(false)
    select reservation.Device
).ToList();

var thing = (
    from res in reservations
    from roomMates in devicesInRoom
        .Where(
            roomMates => roomMates.Equals(res)
        ).DefaultIfEmpty()
    select res
).ToList();

Я все еще получаю указанную выше ошибку. Я не понимаю, почему запросы к БД - это плохо.

Как это исправить?

1 Ответ

1 голос
/ 17 июня 2020

Я не понимаю, почему запросы к БД - это плохо.

EF никогда не поддерживал это. EF Core 2x «решил» это и ряд других ограничений трансляции запросов, просто оценив запросы на клиенте. EF 3 отказался от этой «функции», и вы должны явно объявить, когда вам нужна оценка на стороне клиента, переключившись с LINQ-to-Entities на LINQ-to-Objects, обычно вводя .ToList() или .AsEnumerable() для перехода от server- оценка стороны для оценки на стороне клиента.

Что-то вроде:

var reservations = (
    from reservation in reservationsContext.Reservations
    from reservationType in reservationsContext.Types.Where(
        reservationType => reservationType.Id.Equals(reservation.TypeId)
    ).DefaultIfEmpty().ToList()
    from roomMates in devicesInRoom.ToList()
        .Where(
            roomMates => roomMates.Equals(reservation.Device)
        ).DefaultIfEmpty()
    where reservation.StartDate < viewEnd
          && reservation.EndDate > viewStart
          && reservation.Deleted.Equals(false)
    select reservation.Device
).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...