2011-08-08 3 views
8

프로덕션 서버에서이 오류가 무작위로 발생합니다. 오류 스택 추적이 있습니다. 나는 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) 

라인 14의 코드는 아래에있다. 또한 라인 (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; 
       } 

      } 
     } 
    } 
+0

예외 스택 추적에 언급 된 행의 코드를 공유하십시오. –

+0

Qustion이 업데이트되었습니다. 제 14 행의 코드를 참조하십시오. 다른 위치의 코드입니다. – Tassadaque

답변

1

입니다

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; 
    } 

DataContext를 포함했다 -하지만 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-added

을 위해 그것을 해결했습니다 모델 클래스의 모든 속성을 재정의합니까? 이 도움이

희망,

매트

+0

.net 4.0을 사용하고 있습니다. – Tassadaque

0

내가 같은 오류가 있었지만 원인은 관계에서 기본 및 보조 키와 같은 잘못된 끝으로 정의되고 내 대일 관계 중 하나 .

SQL Server Management Studio 디자이너를 사용하면 자식 테이블에서 부모 테이블로 끌어서 놓기가 너무 쉽고 생성 된 관계의 차이가 누락되었습니다.

모든 관계가 올바르게 정의되어 있는지 확인하십시오.

0

프로덕션 서버에 몇 달 동안 배포 한 후에도 비슷한 문제가있었습니다. 몇 가지 조사를 한 후에 LINQ 연결을 자동으로 닫는 문제가 있다는 것을 알게되었습니다. 이제 정적 확장 메서드를 통해 모든 LINQ TO SQL 연결을 구체적으로 닫고 있습니다. 샘플 코드 :

8

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]() 

사용하려는 테이블이 데이터 컨텍스트 내에서 사용되지 않았기 때문에 '캐시'에 추가됩니다. 이것이 실패 할 수있는 방법 중 하나는 여러 스레드에서 동시에 GetTable()을 호출하는 경우입니다. 이는 전체 응용 프로그램에 대해 단일 데이터 컨텍스트를 사용하고 있음을 나타내는 것이므로 좋지 않습니다. 또한 병렬로 작업을 실행하는 경우 동일한 데이터 컨텍스트를 사용하지 마십시오.

+1

내 응용 프로그램을 EF로 옮겼지만, datacontext를 사용하는 방법에 대한 몇 가지 유용한 정보를 제공 할 수있었습니다. – Tassadaque

+0

@Tassadaque EF에 대한 충분한 경험이 없지만 같은 지침이 적용됩니다. - 둘 이상의 스레드가 동시에 데이터 컨텍스트에 액세스하도록하지 마십시오. - 모든 작업 항목 (요청, UI의 명령 등)에 대해 새로운 데이터 컨텍스트를 사용하십시오. – ErikHeemskerk

+0

각 저장소에서 datacontext를 인스턴스화하는 경우 mycontainer context = new mycontainer(); 그러면 하나 이상의 스레드가 데이터 인터페이스에 액세스 할 수 없게됩니다. 맞습니까? 리포지토리를 통해 데이터베이스에 대한 모든 액세스 권한이 있습니다. – Tassadaque

2

동일한 문제가 있습니다. 나는 그것을 해결했다. 사실 ViewModel에 같은 이름의 중복 속성이 있습니다. 하나의 속성은 BaseViewModel에 있고 다른 하나는 파생 모델에 있습니다.

public class BaseviewModel{ 
    public int UserId { get; set; } 
} 


public class Model : BaseViewModel 
{ 
    public int UserId { get; set; } 
} 

를 들어 내가 지금은 잘 작동

public class BaseviewModel{ 
    public int UserId { get; set; } 
    } 


    public class Model : BaseViewModel 
    { 
     public int User_Id { get; set; } 
    } 

로 변경되었습니다.

0

EF 4.1에서 같은 문제가 발생했습니다. 기존 애플리케이션으로 무슨 일이 있었습니까? EF 4.1에는 .NET Framework 4.0이 필요합니다. Windows 업데이트가 .net 프레임 워크 4.0을 4.5로 대체했으며 동일한 오류가 발생했습니다. 해결책은 .net 4.5를 제거하고 .net 4.0을 설치하는 것입니다. 프로덕션 시스템에서 4.5로 업데이트를 건너 뛰도록 창을 설정해야합니다.

관련 문제