Подтвердить что ты не робот

Entity framework MappingException: тип "XXX" отображается более одного раза

Я использую инфраструктуру Entity в веб-приложении. ObjectContext создается для каждого запроса (используя HttpContext), таким образом, код:

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString();
if (!HttpContext.Current.Items.Contains(ocKey))
{
    HttpContext.Current.Items.Add(ocKey, new ElevationEntityModel(EFConnectionString));
}
_eem = HttpContext.Current.Items[ocKey] as ElevationEntityModel;

Не каждый раз, но иногда у меня есть это исключение:

System.Data.MappingException не был обработан кодом пользователя Message = The тип "XXX" отображается более одного раза. Источник = System.Data.Entity

Я совершенно смущен, и я не знаю, что может вызвать эту проблему.

Может кто-нибудь мне помочь?

4b9b3361

Ответ 1

Это похоже на проблему синхронизации. Простым решением было бы иметь общий объект блокировки (внутри вашего класса):

private static object _lock = new object();

Затем ваш код будет выглядеть следующим образом:

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString(); 

lock (_lock) {
    if (!HttpContext.Current.Items.Contains(ocKey)) 
    { 
          HttpContext.Current.Items.Add(ocKey, new ElevationEntityModel(EFConnectionString)); 
    } 
    _eem = HttpContext.Current.Items[ocKey] as ElevationEntityModel; 

}

Блок блокировки в основном означает, что, когда поток входит в блок блокировки, ни один другой поток не может получить доступ к этому блоку до тех пор, пока не закончится первый поток. Это остановит конфликт между методом "Содержит" и "Добавить".

Примечание: Если в другом месте приложения вы получаете доступ к коллекции Items в HttpContext.Current, вам также потребуется синхронизировать ее. Целесообразно создать пользовательскую коллекцию, добавить ее в коллекцию Items и синхронизировать с ней доступ.

Ответ 2

Это вызвано тем, что вы выполняете многопоточность, и вы получаете доступ к одному объекту ObjectContext без синхронизации потоков сначала...