ObjectDisposedException выбрасывается при попытке сохранить файлы в DbContext - PullRequest
1 голос
/ 13 марта 2019

Я загружаю текстовый файл и записываю каждую разделенную строку в базу данных.Файл содержит более миллиона строк.Загрузка и сохранение в базу данных работает, но прерывается после сохранения в строке await _context.SaveChangesAsync(); со следующей ошибкой

System.ObjectDisposedException HResult = 0x80131622 Сообщение = Невозможно получить доступ к удаленному объекту.Распространенной причиной этой ошибки является удаление контекста, который был разрешен путем внедрения зависимости, а затем попытка использовать тот же экземпляр контекста в другом месте вашего приложения.Это может произойти, если вы вызываете Dispose () для контекста или заключаете контекст в оператор using.Если вы используете внедрение зависимости, вы должны позволить контейнеру введения зависимости позаботиться об удалении экземпляров контекста.Имя объекта: 'LanternDBContext'.

public async void ImportUploadTextFile(string fileName)
{
    string rootFolder = _hostingEnvironment.WebRootPath;

    using (StreamReader sr = new StreamReader(Path.Combine(rootFolder + "/UploadedFiles/", fileName)))
    {
        List<UploadTextFile> InputList = new List<UploadTextFile>();

        while (sr.Peek() >= 0)
        {
            string str;
            string[] strArray;
            str = sr.ReadLine();

            strArray = str.Split(' ');
            InputList.Add(new UploadTextFile
            {

                CorpCode = strArray[0],
                AccountCode = strArray[1],
                CostCenter = strArray[2]

            });
        }

        _context.UploadTextFile.AddRange(InputList);


    }
    await _context.SaveChangesAsync();
}

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

async void предназначен только для обработчиков событий .Он запускает задачу «забей и забудь», которую нельзя ожидать или отслеживать, и которая все еще может выполняться долго после того, как запрос ASP.NET завершится и его контекст будет удален.

Правильный синтаксис для асинхронного методаэто ничего не возвращает, это async Task.Сигнатура метода должна измениться на

public async Task ImportUploadTextFile(string fileName)

, и тот, кто вызывает ImportUploadTextFile, должен ждать ее.Если оно вызывается в действии контроллера, само действие должно быть асинхронным и ожидать его, например:

public async Task Post(whatever)
{
    ....
    await ImportUploadTextFile(fileName);
}
1 голос
/ 13 марта 2019

Ваш контекст БД удаляется ко времени, когда вы пытаетесь сохранить изменения. Вероятно, ваш метод

ImportUploadTextFile

используется за пределами допустимого объема.

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