это не тот контекст, который я получаю напрямую от ServiceProvider
Прежде всего, вы никогда не должны получать контекст базы данных напрямую от поставщика услуг.Вы всегда должны получать его в рамках службы, в противном случае вы получите контекст базы данных и соединение, которое не будет сохраняться в течение всего срока службы вашего приложения.
Таким образом, вы всегда должны использовать контексты базы данных внутри службыприцелы.Это делается неявно в конвейере запросов (например, в контроллерах), но в размещенных сервисах вам придется самостоятельно создавать область обслуживания.Вы также должны убедиться, что вы не оставляете эту область открытой в течение длительного периода времени;лучше спроектировать свои службы так, чтобы они обращались к базе данных только в течение очень ограниченного периода времени и имели несколько кратковременных областей обслуживания вместо одной долгоживущей области.
using (var scope = scopeFactory.CreateScope())
{
var database = scope.ServiceProvider.GetRequiredService<DatabaseContext>();
var entity = database.GetSomeEntity();
scope.ServiceProvider.GetRequiredService<ISomeScopedService>()
.DoSomethingWithTheEntity(entity)
}
Предполагая, что ISomeScopedService
должным образом зарегистрирован как зависимая область, этот код должен разрешать тот же экземпляр контекста базы данных.Контексты базы данных регистрируются как зависимые области (по умолчанию), и, таким образом, это должно разрешить один и тот же экземпляр как от поставщика услуг с областью действия, так и от внедрения конструктора в вашу службу с областью действия.
Если это не работает для вас, то вашреальный код, вероятно, выглядит по-другому, использует другие области (или не имеет областей), или логика, лежащая в основе GetSomeEntity()
, возвращает объект без отслеживания.