【问题标题】:Ninject and Entity FrameworkNinject 和实体框架
【发布时间】:2011-05-12 20:04:58
【问题描述】:

我将 Ninject 与 MVC 应用程序一起使用,同时也使用 EF4.1 Code First。尝试测试是否可以从两个不同的浏览器实例发出请求时遇到问题。

基本上,如果我大致同时在两个浏览器上登录,我会收到一条错误消息,告诉我“在创建模型时无法使用上下文。”

现在,我的第一个假设是我有冲突的实例,因此没有正确设置上下文的范围。

我有一个包含必要表的基类上下文,我从它继承。然后我有一个注入的工厂,并在我请求我的存储库时负责实际创建上下文。

public class ContextFactory
{
     TContext Create<TContext>( ) 
}

我需要这样做,因为我的连接字符串是在运行时决定的,所以我不能只使用 web.config 中包含的连接字符串

public class Repository : BaseRepository<MyObject>
{
   public Repository(IContextFactory factory) : base(factory) 
   {
   }
}

这个想法是,当我需要我的存储库时,我注入存储库,它有自己的注入,创建它的上下文,我可以提供一些默认实现。

我的下一个问题是我没有正确关闭或销毁某些实例。我已经使用其他人的示例在会话范围内设置某些对象数据,但大多数我尝试使用 OnRequestScope。

【问题讨论】:

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


    【解决方案1】:

    听起来你的ContextFactory 需要绑定InRequestScope

    Bind<IContextFactory>().To<ContextFactory>().InRequestScope();
    

    您收到的错误似乎表明两个请求(来自每个浏览器实例的一个请求)都在尝试使用您的 EF 上下文的完全相同的实例,这当然不起作用。

    【讨论】:

    • 其实他使用IContextFactory作为接口进行注入,绑定应该是Bind&lt;IContextFactory&gt;().To&lt;ContextFactory&gt;().InRequestScope();
    • @David Lay:谢谢,在 Repo ctor 中错过了这一点。编辑了我的答案以反映这一点。
    • 我的实际问题不在于创建上下文工厂,而在于创建其中一个存储库。似乎在我无限的智慧中,我决定某些东西适合作为单身人士。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多