- Создание нового контекста данных каждый раз, когда база данных синхронизируется, может исправить это, потому что отслеживание изменений начинается с нуля. Не очень хорошее решение в моих глазах.
Я бы скорее сказал, что это "правильное" решение. Метаданные контекста (a.k.a. Model
) по умолчанию кэшируются для контекста тип , соединение дб поддерживается пулом соединений и открывается / закрывается только при необходимости в любом случае. Таким образом, единственное преимущество повторного использования экземпляра контекста состоит в том, чтобы избежать создания нескольких DbSet
экземпляров.
В то же время трекер будет хранить множество экземпляров «сущностей» и не будет позволять им собирать мусор без необходимости после вызова SaveChanges
. Не учитывать потенциальные проблемы многопоточного доступа.
Так что ИМХО, это путь - создать новый контекст, сделать что-то с ним и избавиться от него.
- Было бы замечательно, если EnsureDeleted также «сбрасывает» трекер изменений или вы можете сделать это вручную.
Действительно, это было бы здорово. Но в настоящее время ни EnsureDeleted
этого не делает, ни EF Core не предоставляет публичный способ сделать это вручную.
Однако существует внутренний путь с обычным риском того, что он может быть изменен в какой-то будущей версии EF Core. Добавление
using Microsoft.EntityFrameworkCore.Infrastructure;
позволит вам использовать что-то вроде этого
_context.ChangeTracker.GetInfrastructure().ResetState();
вероятно до _context.Database.EnsureDeleted();
. Что в основном доказывает, что вы действительно должны использовать первый вариант (новый контекст).