【问题标题】:ChildAction in ASP.NET MVC 3 with Ninject and EntityFramework带有 Ninject 和 EntityFramework 的 ASP.NET MVC 3 中的 ChildAction
【发布时间】:2012-09-06 15:39:53
【问题描述】:

我在使用 Ninject 和 EntityFramework 的 ASP.NET MVC 3 应用程序中遇到了一个奇怪的问题。

我们有一个 ISession 接口,它由 EntitySession 扩展,它实际上是 EntityFramework DbContext 的轻包装。

这是我的 Ninject 绑定:

Kernel.Bind<MyEfDbContext>().To<MyEfDbContext>().InRequestScope();
Kernel.Bind<ISession>().To<EntitySession>().InRequestScope();

如您所见,一切都在请求范围内。

问题是当我执行一个 ChildAction 时,当我第一次点击页面时它工作正常,但是当我刷新页面时,我总是得到这个异常,我必须重建或重置 IIS 才能摆脱它.

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

我在我的控制器中注入了 ISession,它应该在请求结束时被释放。

在我看来,执行子操作不应该执行另一个请求,因此它应该使用与主操作相同的 dbcontext 实例。

我不知道其他人是否对这个堆栈有类似的问题。

我的剃须刀代码如下:

@Html.Action(MVC.Controller.Action(Model.Id))

【问题讨论】:

  • 你用的是哪个版本的ninject?

标签: asp.net-mvc-3 entity-framework ninject


【解决方案1】:

我猜这可能是由于引用 MyEfDbContext 的对象之一具有比 MyEfDbContext 本身更长的生命周期。请检查依赖链并尝试确定您是否在应用程序、会话、单例范围内的对象中使用上下文。

如果找到了,只需将对 MyEfDbContext 的依赖替换为对 MyEfDbContext Factory 对象的依赖即可。

在这种情况下,您可以为自己编写一个工厂类,也可以使用工厂扩展来动态创建工厂 (https://github.com/ninject/ninject.extensions.factory)。

希望有帮助!

【讨论】:

    猜你喜欢
    • 2017-01-29
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多