Проблема параллелизма данных с Linq .ToList() и SqlQuery

Сохраняем список записей из одного приложения, удаляя список элементов и сохраняя обновленный список (список всегда меньше 10 элементов):

using (var context = GetContext())
{
    EFConfiguration.SuspendExecutionStrategy = true;
    using (var dbContextTransaction = context.Database.BeginTransaction())
    {
        try
        {
            context.ItemTable.RemoveRange(context.ItemTable.Where(d => d.ForeignKey == foreignKey));
            foreach (var item in items)
            {
                SetTimeStampFields(item);
                context.ItemTable.Add(item);
            }

            int i = await context.SaveChangesAsync();

            dbContextTransaction.Commit();

            EFConfiguration.SuspendExecutionStrategy = false;
        }
        catch (Exception)
        {
            dbContextTransaction.Rollback();
            EFConfiguration.SuspendExecutionStrategy = false;
            throw;
        }
    }
}

Эти изменения немедленно отображаются в базе данных. Затем извлекаем информацию из этой таблицы из другого приложения:

var itemList = await context.ItemTable.ToListAsync();

Приложение, кажется, получает обновленные значения при первом развертывании, но впоследствии они застревают на одних и тех же значениях. Я попытался добавить AsNoTracking() перед .ToListAsync(), чтобы попытаться обойти любой кеш, поскольку это данные только для чтения, но это не сработало. Единственное решение, которое я нашел, которое получает данные в режиме реального времени:

var itemList = await context.ItemTable.SqlQuery("Select * from TableName").ToListAsync();

Рассматриваемая таблица содержит записи с первичным ключом, двумя внешними ключами и некоторыми данными временных меток.

Мой вопрос: почему контекст не будет получать обновленные значения из таблицы? Эта проблема проявляется в локальных и развернутых средах. Это приложение ASP.NET Core, использующее Entity Framework 6. Рассматриваемая база данных представляет собой зрелую базу данных SQL Server 2012, которая используется в нескольких приложениях без каких-либо проблем, подобных этой.

Какой тип базы данных вы используете? Он предназначен для совместного использования?

jdweng 22.02.2019 17:47

Это база данных SQL Server 2012, и она успешно используется в нескольких приложениях без каких-либо проблем, подобных этой. Я обновил свой пост, чтобы включить это.

BHigzz 22.02.2019 17:50

У меня аналогичная проблема, когда в С# я пишу на SQL Server при открытой SSMS. Чтобы SSMS получала обновления, мне иногда приходится закрывать SSMS и снова открывать.

jdweng 22.02.2019 18:10

Вероятно, контекст в «другом приложении» живет долго и отслеживает (кеширует) ItemTable объекты. Вы можете убедиться в этом, проверив context.ItemTable.Local.Count == 0 до (и после) var itemList = await context.ItemTable.AsNoTracking().ToListAsync();

Ivan Stoev 22.02.2019 19:20

Контексты в обоих приложениях следуют тому же шаблону, что и выше, в небольших количествах, необходимых для использования, только с использованием блоков.

BHigzz 22.02.2019 19:49

Что делает GetContext()?

Chris Pratt 22.02.2019 20:06

Возвращает новый DbContext() с LazyLoadingEnabled и PorxyCreationEnabled, для которых установлено значение false.

BHigzz 22.02.2019 20:16

@IvanStoev, вы были правы, такое действительно случается, хотя я не уверен, куда я могу обратиться с этой информацией.

BHigzz 22.02.2019 20:23

Убедитесь, что контекст создан, используется и удаляется. И все запросы используют опцию AsNoTracking (потому что в противном случае объекты ItemTable могут быть кэшированы из запросов, извлекающих связанные данные - вы сказали, что у них есть FK, следовательно, потенциально связанные объекты с (коллекцией) свойствами навигации)

Ivan Stoev 22.02.2019 20:28
Этот кажется актуальным?
NetMage 22.02.2019 23:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
122
0

Другие вопросы по теме