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