2014-01-29 76 views
1

我已經創建了一個包含MVC5/EF6的站點,並且使用Ninject作爲DI容器將它綁定在一起。Ninject/Entity Framework - 同時處理請求時出錯

除了在一個頁面上,我在同一時間進行2個Ajax調用,所有工作都很好。

控制器/存儲庫吐出各種錯誤,如:

「類型‘System.Data.Entity.Core.EntityException’的第一次機會異常出現在mscorlib.dll附加信息:基礎提供失敗開放「。

一次調用api將始終工作,第二次間歇性地工作。如果我直接在控制器中創建datacontext,它一切正常,所以錯誤必須與Ninject相關,但我無法弄清楚我需要對它進行排序。將範圍變爲瞬態/線程只會改變錯誤。

任何幫助非常感謝。

這是我(編輯)代碼:

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

阿比控制器

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

回答

2

你做錯了。綁定在應用程序啓動完成,你的情況,你創建的上下文和路徑它的實例結合

改變你的結合

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

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

所以當ninject將解決你的倉庫就會看到輸入參數myDataContext構造並將瞭解如何獲得背景

+0

謝謝你的答案。看起來它會是正確的,但我仍然對datacontext的實例將在哪裏創建時感到困惑。請你能拼出來給我。我嘗試了大約20分鐘的谷歌搜索,無法解決這個問題。 – HockeyJ

+0

忽略我。我已經完成了。除了你的觀點之外,我的構造函數正在接受一個DbContext,而不是一個接口或特定的上下文。這阻止了Ninject解決綁定問題。在存儲庫中使用MyDataContext中的構造函數修復了它。感謝您的幫助 – HockeyJ

+0

如果有任何搜索者發現這篇文章,並閱讀了我以前的評論,我也發現這有助於 - http://stackoverflow.com/questions/14840515/no-matching-bindings-are-available-and-the-類型是 - 不自綁定功能於ninject – HockeyJ

相關問題