我试图在我的dbcontext
上调用一些查询。我已经将数据保存在数据库中,现在正在尝试从线程中再次提取数据进行进一步处理,但无法这样做。 dbcontext
被释放了。
我尝试将dbcontext
的服务生存期从默认范围修改为 singleton 和 transient,并将调用dbcontext
的类的生存期也更改为 transient。
服务添加 :
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<PearlIDPContext>(options => options.UseMySQL(Configuration.GetConnectionString("IDPDatabase")), optionsLifetime: ServiceLifetime.Transient);
services.AddScoped<IScanDataRepository, ScanDataRepository>();
services.AddScoped<IOperationsRepository, OperationHistoryRepository>();
services.AddScoped<IExtractedDataRepository, ExtractedDataRepository>();
services.AddScoped<IExtractedColorsRepository, ExtractedColorsRepository>();
services.AddScoped<IRejectionsRepository, RejectionsRepository>();
services.AddScoped<IStartProcess, StartProcess>();
}
数据库修改类:
public class ScanDataRepository : IScanDataRepository
{
private readonly PearlIDPContext context;
public ScanDataRepository(PearlIDPContext context)
{
this.context = context;
}
public async Task<ScanData> AddAsync(ScanData scan) [modified]
{
context.ScanData.Add(scan);
await context.SaveChangesAsync();
return scan;
}
public ScanData GetScanData(string pearlId)
{
return context.ScanData.FirstOrDefault(o => o.PearlId == pearlId);
}
}
修改类的调用:
scanDataRepository.AddAsync(scanData);
try
{
Logger.WriteToLogFile("Fetching Scan details from database for pearlID : " + pearlId, pearlId);
scanData = scanDataRepository.GetScanData(pearlId); // this is line 39
int id = scanData.ScanId;
Logger.WriteToLogFile("Fetching Scan details from database successful for pearlID : " + pearlId + ". DB table id : " + id, pearlId);
}
catch (Exception ex)
{
Logger.WriteToErrorFile("Error getting data from databse. Pearl ID : " + pearlId + ". Error : " + ex.ToString());
}
从数据库获取数据出错。Pearl ID : PI09889. 错误信息:系统.ObjectDisposedException: 无法访问已释放的对象。这种错误的常见原因是处置从依赖性注入解析的上下文,然后在应用程序的其他地方尝试使用相同的上下文实例。如果您对上下文调用Dispose() 或将上下文封装在using语句中,则可能会发生这种情况。如果正在使用依赖项注入,则应让依赖项注入容器处理上下文实例的处理。对象名称:'PearlIDPContext'。 在Microsoft.EntityFrameworkCore.DbContext.CheckDisposed() 中 在Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() 中
在Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Internal.IDbContextDependencies.get_StateManager() 中 在Microsoft.EntityFrameworkCore.Query.QueryContextDependencies.get_StateManager() 中 在Microsoft.EntityFrameworkCore.Query.QueryContext.get_StateManager() 中 在Microsoft.EntityFrameworkCore.Query.QueryContext.BeginTrackingQuery() 中 在Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider._TrackEntities[TOut,TIn](IEnumerable`1 results,QueryContext queryContext,IList`1 entityTrackingInfos,IList`1 entityAccessors)+MoveNext()中 在Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()中 在System.Linq.Enumerable.TryGetFirst [TSource](IEnumerable`1 source,Boolean & found)中 在System.Linq.Enumerable.First [TSource](IEnumerable`1 source)中 在Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass15_1`1.b__0(QueryContext qc)中 在Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute [TResult](Expression query)中 在Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute [TResult](Expression expression)中 在System.Linq.Queryable.FirstOrDefault [TSource](IQueryable`1 source,Expression`1 predicate)中 在MyndIT.Models.ScanDataRepository.GetScanData(String pearlId)中的D:\Projects\Github\PearlIDP\MyndIT\Models\ScanDataRepository.cs:line 33 在MyndIT.StartProcess.ProcessStart(String pearlId)中的D:\Projects\Github\PearlIDP\MyndIT\StartProcess.cs:line 39