【发布时间】:2013-02-17 09:02:32
【问题描述】:
我有一个控制器:
private readonly ILogger _logger;
private readonly IRepository _repository;
public HomeController(ILogger logger, IRepository repository)
{
_logger = logger;
_repository = repository;
}
这是存储库:
public class EfRepository : IRepository
{
// ...methods for add, delete, update entities
// ....
public void Dispose()
{
if (this._context != null)
{
this._context.SaveChanges();
(this._context as IDisposable).Dispose();
this._context = null;
}
}
}
最后,IoC 中的注册类型:
_builder.RegisterType<Logger>().As<ILogger>();
_builder.RegisterType<EfRepository>().As<IRepository>().WithParameter("context", new PcpContext());
当我运行应用程序时出现此错误:
操作无法完成,因为 DbContext 已被 处置。
我尝试像这样更改注册 EfRepository:
_builder.RegisterType<EfRepository>()
.As<IRepository>()
.WithParameter("context", new PcpContext()).InstancePerLifetimeScope();
在这种情况下,第一个请求完成,但在尝试打开其他页面时,我再次收到错误消息。问题出在哪里?
【问题讨论】:
-
永远不要在 dispose 时提交我们的 DbContext。发生异常时将调用 Dispose,但您不想在发生这种情况时保存任何更改。
-
@Steven:我删除了这一行,反正这并不能解决问题。
-
每次我在 dispose 中看到 SaveChanges 时,编码器都会遇到问题。我还没有理解在 Dispose 中建议或推荐“提交”或“保存”的设计模式是什么。我建议您重新评估保存内部处置的计划。错误处理呢。为什么要将数据库的“提交”更改与垃圾收集相关联?值得一读msdn.microsoft.com/en-us/library/fs2xkftw%28VS.80%29.aspx 你什么时候触发 dispose?也许从这里开始:stackoverflow.com/questions/898828/…
标签: asp.net-mvc entity-framework entity-framework-5 autofac