C# 使用不同上下文时无法访问已释放的对象

C# 使用不同上下文时无法访问已释放的对象,c#,entity-framework,C#,Entity Framework,我被实体框架和使用对象的定义困住了 在数据库中保存与该文件相关的详细信息后,我将尝试保存上载的文件。 public async Task<IActionResult> Edit(string List<IFormFile> files, [Bind("param")] Entity entity) { if (ModelState.IsValid) { try {

我被实体框架和使用对象的定义困住了
在数据库中保存与该文件相关的详细信息后,我将尝试保存上载的文件。

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);
    }
公共异步任务编辑(字符串列表文件,[Bind(“param”)]实体)
{
if(ModelState.IsValid)
{
尝试
{
_更新(实体);
wait_context.SaveChangesAsync();
//更新附件
如果(files.Count>0)
{
附件.上传文件(文件);
}
}
catch(DbUpdateConcurrencyException)
{
如果(!EntityExists(id))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回操作(“索引”);
}
返回视图(实体);
}

当我运行应用程序并希望提交表单时,我收到以下错误:
无法访问已释放的对象。 对象名称:“FileBufferingReadStream”

[HttpPost]
公共异步无效上载文件(列表文件)
{
if(files==null | | files.Count==0)
{
log.error(“未选择文件”);
}
尝试
{
列表文件名=新列表();
string directory=directory.GetCurrentDirectory()+“\\wwwroot”;
createDir(目录);
foreach(文件中的var文件)
{
字符串filename=file.GetFilename();
添加(文件名);
}
如果(filenames.Count>0)
foreach(文件名中的var文件名)
{
AttachmentQ(文件名、目录、createdBy);
}
foreach(文件中的var文件)
{
字符串filename=file.GetFilename();
var path=path.Combine(目录,文件名);
使用(var stream=newfilestream(路径,FileMode.Create))
{
等待文件.CopyToAsync(流);
}
添加(文件名);
}
}
捕获(例外e)
{
日志错误(e.Message);
}
}
[ValidateAntiForgeryToken]
public async void AttachmentQ(字符串文件名、字符串路径、字符串createdBy)
{
尝试
{
附件=新附件
{
Name=文件名,
路径=路径,
CreatedBy=CreatedBy,
CreatedDate=DateTime.Now
};
_添加(附件);
wait_context.SaveChangesAsync();
}
捕获(例外e)
{
日志错误(e.Message);
}
}
令人惊讶的是,我在调试模式下没有出错。但当我运行应用程序时,我发现此页面没有工作错误。
我还注意到在使用async时需要返回一个值,但在
UploadFiles()
AttachmentQ()
方法中没有任何返回值

请您帮助我在使用不同上下文时如何处理对象。
谢谢

请不要使用
异步void

如果您想使用异步/等待模式,那么让您的方法返回
Task


公共异步任务上载文件(列表文件)

那么您的错误到底发生在哪里呢?嘿@WahidBitar。它工作得很好。谢谢唯一的问题是,页面没有按照
Edit()
方法中的要求返回到索引页面,因此我得到该页面在之后没有工作的错误。如果方法中没有异步工作,那么不要将async关键字添加到方法中,只需使用
return Task.FromResult((object)null) >您的方法将看起来像“代码>公共任务SOMeMEDO()){返回任务。FromResult((object)null);} @法里法津,请考虑接受我的答案,如果它符合您的问题,如果您不知道这是否解决了问题,那么将其作为评论并询问OP是否执行。然后,如果是这样,就自信地发布它。
  [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);
        }
    }