Сохраняем список записей из одного приложения, удаляя список элементов и сохраняя обновленный список (список всегда меньше 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, которая используется в нескольких приложениях без каких-либо проблем, подобных этой.
Это база данных SQL Server 2012, и она успешно используется в нескольких приложениях без каких-либо проблем, подобных этой. Я обновил свой пост, чтобы включить это.
У меня аналогичная проблема, когда в С# я пишу на SQL Server при открытой SSMS. Чтобы SSMS получала обновления, мне иногда приходится закрывать SSMS и снова открывать.
Вероятно, контекст в «другом приложении» живет долго и отслеживает (кеширует) ItemTable объекты. Вы можете убедиться в этом, проверив context.ItemTable.Local.Count == 0 до (и после) var itemList = await context.ItemTable.AsNoTracking().ToListAsync();
Контексты в обоих приложениях следуют тому же шаблону, что и выше, в небольших количествах, необходимых для использования, только с использованием блоков.
Что делает GetContext()?
Возвращает новый DbContext() с LazyLoadingEnabled и PorxyCreationEnabled, для которых установлено значение false.
@IvanStoev, вы были правы, такое действительно случается, хотя я не уверен, куда я могу обратиться с этой информацией.
Убедитесь, что контекст создан, используется и удаляется. И все запросы используют опцию AsNoTracking (потому что в противном случае объекты ItemTable могут быть кэшированы из запросов, извлекающих связанные данные - вы сказали, что у них есть FK, следовательно, потенциально связанные объекты с (коллекцией) свойствами навигации)





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