C# ';无法完成该操作,因为DbContext已被释放';-添加Dispose()后
在添加行之后,我在各种控制器操作上得到上述错误C# ';无法完成该操作,因为DbContext已被释放';-添加Dispose()后,c#,asp.net,asp.net-mvc,entity-framework,web-applications,C#,Asp.net,Asp.net Mvc,Entity Framework,Web Applications,在添加行之后,我在各种控制器操作上得到上述错误 protected override void Dispose(bool disposing) { repo.Dispose(); base.Dispose(disposing); } …给我的控制器。在添加这一行之前,我遇到了一个问题,DbContext在记录更新操作后返回旧的或缓存的数据。现在这似乎已经解决了,但我遇到了“DbContext已被处理”的问题。我的控
protected override void Dispose(bool disposing)
{
repo.Dispose();
base.Dispose(disposing);
}
…给我的控制器。在添加这一行之前,我遇到了一个问题,DbContext在记录更新操作后返回旧的或缓存的数据。现在这似乎已经解决了,但我遇到了“DbContext已被处理”的问题。我的控制器看起来像这样
public class CasesToReviewController : Controller
{
private CaseReviewRepository repo;
public CasesToReviewController()
{
repo = new CaseReviewRepository(DataAccess.Current);
}
protected override void Dispose(bool disposing)
{
repo.Dispose();
base.Dispose(disposing);
}
}
public class CaseReviewRepository : IDisposable
{
private HSADBContext _db;
public CaseReviewRepository(HSADBContext db)
{
_db = db;
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_db.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
存储库看起来像这样
public class CasesToReviewController : Controller
{
private CaseReviewRepository repo;
public CasesToReviewController()
{
repo = new CaseReviewRepository(DataAccess.Current);
}
protected override void Dispose(bool disposing)
{
repo.Dispose();
base.Dispose(disposing);
}
}
public class CaseReviewRepository : IDisposable
{
private HSADBContext _db;
public CaseReviewRepository(HSADBContext db)
{
_db = db;
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_db.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
DataAccess.Current是一个Ninject绑定。我不确定我能发布多少,因为这不是我的代码,但它似乎在我正在处理的项目的其他控制器中工作得很好,并且在将Dispose()函数添加到控制器后错误的变化使我认为这是我实现IDisTable的方式的问题
通过使用调试器,我看到在控制器构造函数中创建上下文和实际输入存储库方法之间,上下文正在被释放。就像当执行离开控制器上下文的作用域时一样。Dispose()方法就是这样工作的吗?如果是这样,我是否需要从构造函数中删除Dispose()实现?您是否尝试过在
this.Dispose
之前以相反的顺序调用它(意思是base.Dispose
)?是否从方法中返回实体对象,在处理用于获取它们的数据上下文之后?老实说,我真的不知道什么时候调用dispose,什么时候处理上下文。有问题的存储库调用大多返回IEnumerableLike,例如,我不明白为什么在控制器和存储库中需要Dispose()实现uses@evanmcdonnal-不,那没有解决问题