Не удается получить контекст объекта Entity Framework для проверки в SimpleInjectorInitializer

Кажется, когда я установил пакет интеграции Simple Injector MVC3, SimpleInjectorInitializer был помещен в папку App_Start. Однако, когда метод Verify() вызывается в Initialize(), он выдает эту ошибку при попытке получить контекст объекта Entity Framework (я также предоставил внутренние исключения):

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() в метод InitializeContainer() класса SimpleInjectorInitializer.

Я не совсем уверен, что делать на этом этапе, но эта проблема, кажется, несколько связана с этим вопросом: Исключение строки подключения после обновления до Ninject 3.0.0-rc3

Кажется, что приложение пытается загрузить контекст до того, как Entity Framework даже узнает о своем собственном и не может правильно проанализировать строку подключения?


person user1417835    schedule 10.07.2012    source источник


Ответы (1)


Кажется, что приложение пытается загрузить контекст до того, как Entity Framework даже узнает о своем собственном и не может правильно проанализировать строку подключения?

Вы абсолютно правы. Метод SimpleInjectorInitializer.Initialize вызывается автоматически на этапе предварительного запуска приложения. Хотя на этом этапе нет проблем с настройкой контейнера, в вашей ситуации слишком рано вызывать Verify(). Verify просто перебирает все регистрации и вызывает для них GetInstance, чтобы проверить, может ли он их создать. Однако в этот момент жизненного цикла приложения контекст объекта Entity Framework не может быть создан. Должен сказать, мне кажется странным, что EF framework знает что-то о ASP.NET framework, но, к сожалению, так оно и есть.

Чтобы решить эту проблему, вы можете либо перенести вызов Verify(), либо полную инициализацию на более поздний момент запуска приложения. Например, вы можете сделать следующее:

  1. Удалите [assembly: WebActivator.PreApplicationStartMethod] (верхняя строка) класса SimpleInjectorInitializer.cs.
  2. Добавьте вызов метода SimpleInjectorInitializer.Initialize() в событие Application_Start() глобального asax.

После этого инициализация (и особенно проверка) графа объектов выполняется после состояния до инициализации.

Другой вариант — удалить вызов container.Verify(); из метода SimpleInjectorInitializer.Initialize, так как вас убивает именно процесс ранней проверки. Тем не менее, сначала прочитайте это Проверьте конфигурацию контейнера, чтобы увидеть альтернативы, прежде чем сделать это.

Пакет SimpleInjector.MVC NuGet использует WebActivator.PreApplicationStartMethod для удобства. Это позволяет пакету «просто работать», без необходимости для разработчика выполнять какое-либо ручное кодирование (кроме, конечно, подключения контейнера), чтобы заставить его работать. Но так как это не работает при работе с Entity Framework, нам придется пересмотреть эту стратегию.

person Steven    schedule 11.07.2012
comment
Спасибо, Стивен! Я обязательно прочитаю это, прежде чем решить, какой лучший образ действий может быть с моей стороны. Я надеюсь, что вы сможете найти решение для будущих итераций. Кроме того, есть ли более прямой способ связаться с вами, если возникнут какие-либо другие проблемы? О, и мой второстепенный вопрос заключался в том, действительно ли вызовы регистрации должны быть перемещены в метод InitializeContainer(), как показано в примерах в Application_Start() в Global.asax. - person user1417835; 11.07.2012