DBContext: удаление без вызова Dispose (). Не используя оператор использования - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь вызвать несколько запросов на моем dbcontext. Я сохранил данные в БД и сейчас пытаюсь снова извлечь данные в потоке, чтобы выполнить дальнейшую обработку, но не могу этого сделать. dbcontext отображается как распоряжение.

Я попытался изменить срок службы dbcontext для одноэлементного и переходного процесса с области по умолчанию, а также изменил время жизни классифицированного вызова dbcontext для переходного процесса.

Добавление услуг:

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>();
}

Класс модификации Db:

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());
}

Ошибка при полученииданные из базы данных. Жемчужина ID: PI09889. Ошибка: System.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.Intor.TraverQueryContext queryContext, IList`1 entityTrackingInfos, IList`1 entityAccessors) + MoveNext () в Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext (.RueF) .Tegn.Tegn.Tegn.ExeF. `1 источник, логическое и найдено) в System.Linq.Enumerable.First [TSource] (источник IEnumerable`1) в Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler. <> c__DisplayClass15_1`1.b__0 (QueryContext qc) в Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute [TResult] (запрос выражений) в Microsoft.EntityFrovid.ExueryQueryUueryUueryUuCu[TResult] (выражение выражения) в System.Linq.Queryable.FirstOrDefault [TSource] (источник IQueryable`1, предикат Expression`1) в MyndIT.Models.ScanDataRepository.GetScanData (String pearlId) в D: \ Projects \ Github \ PearlID\ MyndIT \ Models \ ScanDataRepository.cs: строка 33 в MyndIT.StartProcess.ProcessStart (String pearlId) в D: \ Projects \ Github \ PearlIDP \ MyndIT \ StartProcess.cs: строка 39

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Пожалуйста, убедитесь, что код, где находится эта строка:

scanDataRepository.Add(scanData);

Ожидается правильно. Если этот код выполняется внутри метода, который возвращает Задачу, и эта задача не ожидается должным образом, то база данных может быть в конечном итоге удалена, поскольку вызывающий объект уже завершил работу, даже если ваши операции с базой данных еще не завершены.

0 голосов
/ 11 ноября 2019

Вы должны сохранить свой DbContext как временный. У меня была эта проблема много раз раньше. То, что происходит, заключается в том, что метод заканчивает работу и избавляется от вашего контекста до того, как закончится ваша тема. Если вы используете поток, чтобы остановить блокировку пользовательского интерфейса, вам следует использовать ключевое слово await (на самом деле вы должны использовать await в любом случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...