使用不同的上下文时无法访问已处置的对象

时间:2017-10-26 00:11:47

标签: c# entity-framework

我被困在实体​​框架的定义和使用对象。
一旦我在数据库中保存与该文件相关的详细信息,我正在尝试保存上传的文件。

public async Task<IActionResult> Edit(string List<IFormFile> files, [Bind("param")] Entity entity)
    {
        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(entity);
                await _context.SaveChangesAsync();   

                //update Attachments
                if (files.Count > 0)
                {
                    attachment.UploadFiles(files);
                }
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!EntityExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction("Index");
        }
        return View(entity);
    }


当我运行应用程序并想要提交下面收到的表单时出现错误:
无法访问已处置的对象。 对象名称:'FileBufferingReadStream'。

  [HttpPost]
    public async void UploadFiles(List<IFormFile> files)
    {
        if (files == null || files.Count == 0)
        {
            log.error("files not selected");
        }
        try
        {
            List<string> filenames = new List<string>();
            string directory = Directory.GetCurrentDirectory() + "\\wwwroot";

            createDir(directory);

            foreach (var file in files)
            {
                string filename = file.GetFilename();
                filenames.Add(filename);
            }
            if (filenames.Count > 0)
                foreach (var filename in filenames)
                {
                   AttachmentQ(filename, directory, createdBy);
                }
            foreach (var file in files)
            {
                string filename = file.GetFilename();
                var path = Path.Combine(directory, filename);
                using (var stream = new FileStream(path, FileMode.Create))
                {
                    await file.CopyToAsync(stream);
                }
                filenames.Add(filename);
            }
        }
        catch (Exception e)
        {
            log.error(e.Message);

        }
    }

    [ValidateAntiForgeryToken]
    public async void AttachmentQ(string filename, string path, string createdBy)
    {
        try
        {
            Attachment attachment = new Attachment
            {
                Name = filename,
                Path = path,
                CreatedBy = createdBy,
                CreatedDate = DateTime.Now
            };

                _context.Add(attachment);
                await _context.SaveChangesAsync();
        }
        catch (Exception e)
        {
            log.error(e.Message);
        }
    }

令人惊讶的是我在调试模式下没有出错。但是当我运行应用程序时,我得到此页面无效错误 我还注意到,当我使用异步时,我需要返回一个值,但我在UploadFiles()AttachmentQ()方法中没有任何返回值。
在使用不同的上下文时,能否帮助我如何处理对象。
谢谢

1 个答案:

答案 0 :(得分:1)

根本不要使用async void

如果你想使用async / await模式,那么让你的方法返回Task

public async Task UploadFiles(List<IFormFile> files)