Ninject / Entity Framework - 同时处理请求时出错

时间:2014-01-29 20:36:49

标签: c# asp.net-mvc entity-framework ninject asp.net-mvc-5

我创建了一个使用MVC5 / EF6的网站,并使用Ninject作为DI容器将它绑定在一起。

一切正常,除了在一个页面上,我同时进行2个ajax调用。

控制器/存储库吐出各种错误,例如:

“mscorlib.dll中出现'System.Data.Entity.Core.EntityException'类型的第一次机会异常。附加信息:基础提供程序在打开时失败。”

对api的一次调用将始终有效,第二次间歇性地进行。如果我直接在控制器中创建datacontext,它一切正常,所以错误必须与Ninject有关,但我无法解决我需要做什么来排序它。将范围改为Transient / Thread只会改变错误。

任何帮助都非常感激。

这是我的(编辑过的)代码:

从Global.asax Application_Start()

调用
var context = new myDataContext();

// Lowest down wins
IKernel kernel = new StandardKernel();

DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));

GlobalConfiguration.Configuration.DependencyResolver
    = new App_Start.NinjectResolver(kernel);

kernel.Bind<IRepository<Models.MyClass>>()
    .To<MyRepository>()
    //.InTransientScope()
    //.InThreadScope()
    .InRequestScope()      
    .WithConstructorArgument("context", context);

Api控制器

  public class MyApiController : ApiController
  {
    IRepository<MyRepository> _repository;

    public EMAAFController(IRepository<MyRepository> repository)
    {
     _repository = repository;
    }



    public IEnumerable<Models.MyClass> Get(int id)
    {
      var itemToReturn = _repository.GetAll().Where(i => i.id == id).ToList();

      return itemToReturn;
    }
  }

1 个答案:

答案 0 :(得分:2)

你做错了。绑定在应用程序启动时完成,在您的情况下,您创建上下文实例并将其路径绑定到

将您的绑定更改为

kernel.Bind<myDataContext>().ToSelf().InRequestScope();

kernel.Bind<IRepository<Models.MyClass>>().To<MyRepository>().InRequestScope()   

因此,当ninject将解析您的存储库时,它将看到带有输入参数myDataContext的构造函数,并将了解如何获取上下文