Платформа сущностей MappingException: тип 'XXX был сопоставлен более одного раза - PullRequest
26 голосов
/ 17 июня 2010

Я использую Entity Framework в веб-приложении.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 не обрабатываетсякод пользователя Сообщение = тип «XXX» был отображен более одного раза.Source = System.Data.Entity

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

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

Ответы [ 2 ]

19 голосов
/ 17 июня 2010

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

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; 

}

Блок блокировки в основном означает, что как только поток входит в блок «блокировки», никакие другие потоки не могут получить доступ к этому блоку, пока не завершится первый поток. Это остановит конфликт между методом «Contains» и методом «Add».

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

10 голосов
/ 17 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...