Миграция с ef core 2.2.6 на 3.1, получение проблем при наличии нескольких включений - PullRequest
0 голосов
/ 12 февраля 2020

Я только что перенес ядро ​​EF с 2.2.6 на 3.1, и у меня возникает проблема тайм-аута, когда используется больше операторов include, как показано ниже:

  var z = await _context.PortfolioCompany
                                 .Include(x => x.val).ThenInclude(x => x.valft)
                                 .Include(x => x.val).ThenInclude(x => x.ipv)
                                 .Include(x => x.up)
                                 .Include(x => x.pcf)
                                 .Include(b => b.pcl)
                                 .SingleOrDefaultAsync(p => p.DealCode.ToUpper() == dealCode.ToUpper(), cancellationToken);

Пожалуйста, предложите, как решить эту проблему. При использовании того же запроса в ядре EF 2.2.6 он работал нормально, но теперь я получаю проблему тайм-аута

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes говорит, что при использовании множественного оператора include он показывает ошибку тайм-аута, но не уверен, как решить это? с ef core 2.2.6

проблем не было

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

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

Как долго длился этот запрос принять для запуска в EF Core 2.2?

Я бы посоветовал взглянуть на связанные таблицы, чтобы увидеть, какие таблицы могут содержать много столбцов или какие-либо особенно большие столбцы. (MEMO, VARCHAR (Макс.), Что-то в этом роде) Если вы выборочно исключаете таблицы, есть ли подозрение, которое приводит к большой задержке?

Например, если вы исключили .Include(x => x.pcf) и все загружается без таймаута. Вы можете извлечь файл PCF перед его использованием, введя:

_context.Entry(z).Reference(x => x.pcf).Load();

Хотя, если этот запрос должен вернуть данные в представление et c. Я настоятельно рекомендую создать структуру модели представления на основе того, что необходимо для представления, и использовать Select для его заполнения, а не загружать весь граф сущностей. Если вместо этого вы хотите загрузить сущность для применения обновлений, я бы предпочел загружать только наиболее часто обновляемые таблицы и позволять EF лениво загружать остальные, если это необходимо, или использовать метод Load для выборки. если нужно.

0 голосов
/ 12 февраля 2020

Если вы используете настройки по умолчанию на SQL Сервере, запросы должны быть без учета регистра. Следовательно, вам не нужно использовать .ToUpper(). Кроме того, это может помешать запросу использовать правильные индексы. Я полагаю, в вашем столбце dealCode и внешних ключах есть правильные индексы? Попробуйте удалить вызовы .ToUpper() и посмотрите, выполняется ли ваш запрос быстрее.

Обновление На основе вашей ссылки похоже, что обходной путь состоит в том, чтобы разбить запрос на несколько запросов и сшить это вместе в памяти, как сделано здесь: https://github.com/dotnet/efcore/issues/18017#issuecomment -535763068

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...