2

Я делаю веб-приложение MVC 3 с использованием Entity Framework, но я получаю эту ошибку. В моем слое данных я использовал вспомогательный помощник класса.MVC 3 Entity Framework Error - элемент уже добавлен. Ключ в словаре

Ошибка followig:

Элемент уже был добавлен. Ключ в словаре: Добавлен ключ «DbActiveContext»: «DbActiveContext»

Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении: System.ArgumentException: Товар уже добавлен. Ключ в словаре: «DbActiveContext» Ключ добавляется: «DbActiveContext»

Ошибка в строке 24:

Line 22:     { 
Line 23:      _connection = new flashEntities(ConnectionString); 
**Line 24:      HttpContext.Current.Items.Add("DbActiveContext", _connection);** 
Line 25:     } 
Line 26:     return _connection; 

мой Connection вспомогательный класс выглядит следующим образом (то же подключение вспомогательный класс работает отлично в другом MVC 3 веб-приложение):

public ObjectContext Connection 
    { 
     get 
     { 
      if (_connection == null && HttpContext.Current.Items["DbActiveContext"] != null) 
      { 
       _connection = (flashEntities)HttpContext.Current.Items["DbActiveContext"]; 
      } 
      else 
      { 
       _connection = new flashEntities(ConnectionString); 
       HttpContext.Current.Items.Add("DbActiveContext", _connection); 
      } 
      return _connection; 
     } 
    } 
    private ObjectContext _connection; 

    public string ConnectionString 
    { 
     get 
     { 
      return ConfigurationManager.ConnectionStrings["flashEntities"].ToString(); 
     } 
    } 

Любая помощь будет очень заметной. Благодаря

+0

Является 'DbActiveContext' объявлен в другом месте, например, web.config,? – Gabe

+0

@Gabe: Не он просто объявлен в вспомогательном классе связи, нигде больше. –

+0

Вместо 'HttpContext.Current.Items.Add (« DbActiveContext », _connection);', попробуйте 'HttpContext.Current.Items [" DbActiveContext "] = _connection;' Тогда это просто заменит существующий элемент тем же ключом. – Netricity

ответ

1

Что-то вызывает линию

HttpContext.Current.Items.Add("DbActiveContext", _connection); 

выполнить более одного раза. Еще раз посмотрим на ваше условие If. Вы могли бы заставить его терпеть неудачу более одного раза? Скажем, если для параметра _Connection установлено значение null ...

0

Threading может вызвать это. Не видя кода, который называет это, трудно сказать, так ли это здесь, но рассмотрите два потока, которые запрашивают dbcontext. Ваш код примерно:

1. if (!dbcontext) 
    2. add dbcontext 

Изображение это как:

Тема 1 выполняет линия 1, ветви к линии 2
Пропустите 2 выполняется строка 1, ветви к линии 2
Пропустите 1 выполняется строка 2, Добавлено dbcontext
Резьба 2 выполняет строку 2, пытается добавить dbcontext, asplode.

Довольно классическая проблема с резьбой.

Вы можете предотвратить это с замком:

private object creationLock = new object(); 

. . . 

lock(creationLock) 
{ 
    if (...) 
     add... 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^