Ninject и Entity Framework - PullRequest
       35

Ninject и Entity Framework

3 голосов
/ 13 мая 2011

Я использую 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.

1 Ответ

4 голосов
/ 13 мая 2011

Похоже, ваш ContextFactory должен быть связан InRequestScope:

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

Ошибка, которую вы получаете, указывает на то, что оба запроса - по одному от каждого экземпляра браузера - пытаются использовать один и тот же точный экземпляр вашего контекста EF, что, конечно, не будет работать.

...