У меня есть бэкэнд-сервис, который имеет собственный контекст. Эта служба опрашивает внешние устройства каждую минуту и запускается по минутному таймеру, чтобы повторить процесс. Каждую минуту служба также проверяет изменения состояния устройства (запуск, остановка, запуск, выключение), которые необходимо применить. Эти изменения состояния, если таковые имеются, будут исходить от метода Post сервера Razor Page, использующего DBcontext и DI для обновления DeployedAppliance в БД.
Проблема заключается в следующем: страница Razor успешно обновляет базу данных DeployedAppliance (перечисление состояния). Однако область обслуживания бэкэнда, создаваемая заново каждую минуту, не получает новое состояние DeployedAppliance.
Вот некоторый соответствующий код бэкэнда:
public class ApplianceService : IHostedService, IDisposable
{
private Timer _timer;
private readonly IServiceScopeFactory _serviceScopeFactory;
private IApplianceManager applianceMgr;
public Task StartAsync(CancellationToken stoppingToken)
{
applianceMgr = new ApplianceManagerImpl();
...
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
}
private void DoWork(object state)
{
// Create local scope.
using (var scope = _serviceScopeFactory.CreateScope())
{
var _db = scope.ServiceProvider.GetRequiredService<DbContext>();
applianceMgr.Db = _db;
applianceMgr.DoRemoteAppliancePolling();
applianceMgr.CheckForApplianceStateChange();
}
}
}
public class ApplianceManager : IApplianceManager
{
DeployedAppliance DeployedAppliance {get; set;}
...
public void CheckForApplianceStateChange()
{
// This DeployedAppliance object never gets the change in state that is actually in the Db
DeployedAppliance = Db.DeployedAppliances.Find(ApplianceDeploymentID);
...
}
}
Я посмотрел на представления stackoverflow для refre sh ДБ сущностей. Я попытался следующий код, чтобы refre sh Db.
// refresh DBcontext
var context = ((IObjectContextAdapter)Db).ObjectContext;
var refreshableObjects = Db.ChangeTracker.Entries().Select(c => c.Entity).ToList();
context.Refresh(RefreshMode.StoreWins, refreshableObjects);
Как бы то ни было, этот код выдает: InvalidCastException: Невозможно привести объект типа 'Pilot.Models.Database.DbContext' к типу 'System .Data.Entity.Infrastructure.IObjectContextAdapter. Обратите внимание, что DbContext наследуется от IdentityDbContext.