【问题标题】:Cannot retrieve Entity Framework Object Context for Verification in SimpleInjectorInitializer无法检索实体框架对象上下文以在 SimpleInjectorInitializer 中进行验证
【发布时间】:2012-07-10 12:44:48
【问题描述】:

好像我在安装Simple Injector MVC3 Integration 包的时候,SimpleInjectorInitializer 放在了App_Start 文件夹下。但是,当在 Initialize() 中调用 Verify() 方法时,在尝试获取 Entity Framework Object Context 时会产生此错误(我也提供了内部异常):

The supplied connection string is not valid, because it contains insufficient mapping or metadata information.
    InnerException: Unable to determine application context. The ASP.NET application path could not be resolved.
        InnerException: Exception has been thrown by the target of an invocation.
            InnerException: (Shown in browser) This method cannot be called during the application's pre-start initialization phase.

似乎我还必须将注册调用从 Global.asax.cs Application_Start() 移至 SimpleInjectorInitializer 的 InitializeContainer() 方法。

我现在不完全确定该怎么做,但这个问题似乎与这个问题有些相关:Connection string exception after upgrading to Ninject 3.0.0-rc3

似乎应用程序在 Entity Framework 意识到它自己之前尝试加载上下文并且无法正确解析连接字符串?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 dependency-injection ioc-container simple-injector


    【解决方案1】:

    似乎应用程序之前尝试加载上下文 Entity Framework 甚至知道它自己并且无法正确地 解析连接字符串?

    你完全正确。 SimpleInjectorInitializer.Initialize 方法在预应用程序启动阶段自动调用。尽管此时配置容器没有问题,但在您的情况下,调用 Verify() 还为时过早。 Verify 简单地迭代所有注册并在它们上调用GetInstance 以查看它是否可以创建它。但是,在应用程序的生命周期中,无法创建实体框架对象上下文。我必须说,我觉得 EF 框架对 ASP.NET 框架一无所知,这很奇怪,但不幸的是它就是这样。

    要解决此问题,您可以将Verify() 调用或完全初始化移到应用程序启动的稍后时刻。例如,您可以执行以下操作:

    1. 删除 SimpleInjectorInitializer.cs 类的 [assembly: WebActivator.PreApplicationStartMethod](顶行)。
    2. 在全局 asax 的 Application_Start() 事件中添加对 SimpleInjectorInitializer.Initialize() 方法的调用。

    完成此操作后,对象图的初始化(尤其是验证)在预初始化状态之后完成。

    另一种选择是从SimpleInjectorInitializer.Initialize 方法中删除container.Verify(); 调用,因为它是早期验证过程正在扼杀你。但是,在这样做之前,请先阅读此Verify the container’s configuration,以查看替代方案。

    为方便起见,SimpleInjector.MVC NuGet 包使用WebActivator.PreApplicationStartMethod。它允许包“正常工作”,而无需开发人员进行任何手动编码(当然连接容器除外)来使其工作。但由于这在使用实体框架时不起作用,我们将不得不重新考虑这个策略。

    【讨论】:

    • 谢谢,史蒂文!在决定我的最佳行动方案可能是什么之前,我一定会读一读。我希望您能够为未来的迭代找到解决方案。另外,如果出现任何其他问题,是否有更直接的方式与您联系?哦,我的第二个问题是注册调用是否确实应该移到 InitializeContainer() 方法中,正如示例在 Global.asax 中的 Application_Start() 中显示的那样。
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2018-08-11
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多