尝试将文件保存到DbContext时抛出ObjectDisposedException

时间:2019-03-13 14:07:41

标签: c# asp.net-core entity-framework-core

我正在上传一个文本文件,并将每个分割行写入数据库。该文件有超过一百万行。上传和保存到数据库有效,但在await _context.SaveChangesAsync();行中保存后由于以下错误而中断

  

System.ObjectDisposedException HResult = 0x80131622 Message =无法访问已处置的对象。导致此错误的常见原因是,处理从依赖项注入中解决的上下文,然后稍后尝试在应用程序中的其他位置使用相同的上下文实例。如果在上下文上调用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 个答案:

答案 0 :(得分:2)

async void仅适用于事件处理程序。它触发了一个即发即弃的任务,该任务无法等待或监视,并且在ASP.NET请求终止并处理其上下文之后仍可以运行很长时间。

不返回anythig的异步方法的正确语法是async Task。方法签名应更改为

public async Task ImportUploadTextFile(string fileName)

,呼叫ImportUploadTextFile的人都应等待。如果在控制器动作中调用了该动作,则动作本身应该是异步的并等待它,例如:

public async Task Post(whatever)
{
    ....
    await ImportUploadTextFile(fileName);
}

答案 1 :(得分:1)

您尝试保存更改时将丢弃数据库上下文。可能是您的方法

  

ImportUploadTextFile

超出了适当范围使用。