已添加具有相同键的项目

Tas*_*que 8 linq asp.net asp.net-mvc linq-to-sql asp.net-mvc-3

我在生产服务器上随机获得此错误,这里是错误的堆栈跟踪.我正在使用linq到sql和.net 4.0

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.EvoletDataContext.get_sysModules() in D:\MyProj\Models\datamdl.designer.cs:line 1294
   at UserManagement.Models.FilterRepository.GetModuleHead(String actionName) in D:\MyProj\Models\FilterRepository.cs:line 14
   at UserManagement.Models.DummyAttrib.OnAuthorization(AuthorizationContext filterContext) in D:\MyProj\Models\Filters.cs:line 44
   at Glimpse.Net.Plumbing.GlimpseAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
   at System.Web.Mvc.Controller.ExecuteCore()
   at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
   at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
   at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d()
   at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
   at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
   at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Run Code Online (Sandbox Code Playgroud)

第14行的代码如下.我还包括了datacontext

private EvoletDataContext db = new EvoletDataContext();

        public sysModule GetModuleHead(string actionName)
        {
            var val =  (from mod in db.sysModules
                        where
                        mod.ModuleActionResult.ToLower().Equals(actionName.ToLowerInvariant())
                    select mod).SingleOrDefault();
            return val;
    }
Run Code Online (Sandbox Code Playgroud)

第44行的代码是

public class DummyAttrib:FilterAttribute,IAuthorizationFilter
    {

        private readonly FilterRepository _filterRepository = new FilterRepository();
        public void OnAuthorization(AuthorizationContext filterContext) 
        {
            if (!filterContext.Controller.ControllerContext.IsChildAction && !filterContext.HttpContext.Request.IsAjaxRequest())
            {
                var cont = (ApplicationController)filterContext.Controller;
                                var modhead = _filterRepository.GetModuleHead(filterContext.RouteData.Values["action"].ToString());
                if (cont.DocumentID != 0 && modhead !=null) 
                {
                    if (_filterRepository.hasRightonModuleChildren(modhead.ModuleID, cont.RoleID))
                        return;
                }
                if (cont.DocumentID == 0 && !filterContext.RouteData.Values["action"].ToString().ToLowerInvariant().Equals("index"))
                {
                    filterContext.Result = new RedirectResult("/account.mvc/AccessDenied");
                    return;
                }

                if (!_filterRepository.hasRighton(cont.DocumentID, cont.RoleID))
                {
                    filterContext.Result = new RedirectResult("/account.mvc/AccessDenied");
                    return;
                }

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Eri*_*erk 9

LINQ维护了您已经使用的各种表的"缓存",以防止必须多次查找它们.

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]()
Run Code Online (Sandbox Code Playgroud)

您之前尝试使用的表尚未在数据上下文中使用,因此将其添加到"缓存"中.这可能失败的方法之一是,如果您GetTable()同时从多个线程调用,这表明您正在为整个应用程序使用单个数据上下文,这不是一个好主意.此外,如果您并行执行任务,请不要使用相同的数据上下文.


Mat*_*ths 1

它看起来像一个错误 - 但 MS 已针对 .NET 4 修复了它

http://connect.microsoft.com/VisualStudio/feedback/details/496178/linq-to-sql-projection-throws-argumentexception-an-item-with-the-same-key-has-already-been-linked

您是否覆盖模型类中的任何属性?

希望这可以帮助,

马特