Linq - Случайный элемент с тем же ключом уже был добавлен Ошибка - PullRequest
1 голос
/ 26 августа 2011

Я получаю сообщение об ошибке «Элемент с таким же ключом уже добавлен».Я получаю эту ошибку случайно, когда многие пользователи одновременно пытаются получить доступ к одной и той же странице сайта.В коде передается docid и пользователю отображается соответствующая справка.Поскольку каждый пользователь просматривает одну и ту же страницу, одинаковый идентификатор передается всем пользователям.В этом вызове нет операции вставки

Трассировка стека и исходный код упомянутой строки задаются следующим образом

public string DocDescription(int docid)
        {
            DocumentRepository _Documentrepository = new DocumentRepository();            
            return _Documentrepository.GetDocDescription(docid);
        }

    }


public string GetDocDescription(int DocID)
        {
            if (DocID != 0)
                return db.sysDocuments.SingleOrDefault(p => p.DocumentID == DocID).Description==null?"No Description Available":db.sysDocuments.SingleOrDefault(p => p.DocumentID == DocID).Description;
            else
                return "No Description Available";
        }

Выдержка трассировки стека:

System.Web.HttpException (0x80004005): Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerWrapper'. ---> System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Web.HttpException (0x80004005): Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'. ---> System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Data.Linq.DataContext.GetTable(MetaTable metaTable)
   at System.Data.Linq.DataContext.GetTable[TEntity]()
   at UserManagement.Models.DocumentRepository.GetDocDescription(Int32 DocID) in D:\Myproj\UserManagement\UserManagement\Models\DocumnetRepository.cs:line 109
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at Castle.Proxies.ControllerActionInvokerProxy.InvokeActionMethod_callback(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget()
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at Glimpse.Net.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation invocation)
   at Castle.DynamicProxy.AbstractInvocation.Proceed()

Ответы [ 2 ]

4 голосов
/ 26 августа 2011

Из вашего кода и комментариев я понял, что вы храните контекст БД в статической переменной.Обычно это плохая идея при работе с сущностями.

  1. DbContext не является потокобезопасным.Таким образом, множественные пользователи, работающие с вашим сайтом, будут вызывать такие ошибки в контексте.

  2. Общее предложение по работе с контекстом состоит в том, чтобы предпочесть краткосрочный контекст.Так что просто создайте новый экземпляр, когда вам это нужно, а затем забудьте об этом.Для веб-сайтов довольно часто используют инверсию контейнера управления, такого как Unity, Castle.Winsdor и т. Д., И настраивают его так, чтобы он возвращал один экземпляр на каждый веб-запрос для вашего DbContext.Это даст вам достаточную производительность, поэтому все сущности, необходимые для текущего запроса, будут кэшированы и не вызовут проблем с многопоточностью одновременно.

1 голос
/ 26 августа 2011

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

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