2011-08-08 20 views
8

Tôi nhận được lỗi này một cách ngẫu nhiên tại máy chủ sản xuất ở đây là dấu vết ngăn xếp của lỗi. Tôi đang sử dụng LINQ để sql và .net 4.0Một mục có cùng khóa đã được thêm

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) 

Mã tại dòng 14 dưới đây. Tôi cũng đã bao gồm các 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; 
    } 

Mã tại dòng 44 là

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

Vui lòng chia sẻ mã từ dòng được đề cập trong dấu vết ngăn xếp ngoại lệ –

+0

Cập nhật Qustion. Vui lòng xem mã cho dòng 14 tương tự là mã ở vị trí khác – Tassadaque

Trả lời

0

tôi đã có lỗi tương tự nhưng nguyên nhân là một trong những mối quan hệ nhiều-to-one của tôi được định nghĩa với kết thúc sai như các phím tiểu học và trung trong mối quan hệ .

Sử dụng trình quản lý máy chủ SQL Designer Studio quá dễ dàng để kéo-thả từ bảng con vào bảng cha và bỏ qua sự khác biệt trong mối quan hệ đã tạo.

Kiểm tra xem tất cả các mối quan hệ của bạn đã được xác định chính xác chưa.

0

Chúng tôi đã gặp sự cố tương tự sau vài tháng triển khai trong máy chủ sản xuất. Sau khi làm một số nghiên cứu tôi phát hiện ra rằng đôi khi có một vấn đề với LINQ kết nối đóng tự động. Bây giờ chúng tôi đang cụ thể đóng tất cả các kết nối LINQ TO SQL thông qua phương pháp mở rộng tĩnh. Mã mẫu:

public static void extClose(this System.Data.Linq.DataContext dataContext, bool submitChanges) 
{ 
    if (null != dataContext && System.Data.ConnectionState.Closed != dataContext.Connection.State) 
    { 
     if (true == submitChanges) 
     { 
      dataContext.SubmitChanges(); 
     } 
     dataContext.Connection.Close(); 
    } 
} 
8

LINQ duy trì một 'bộ nhớ cache' của các bảng bạn đã sử dụng để tránh phải tra cứu chúng nhiều lần.

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

Các bảng bạn đang cố gắng sử dụng không được sử dụng trong bối cảnh dữ liệu trước đó, vì vậy nó được bổ sung vào 'bộ nhớ cache. Một trong những cách này có thể thất bại là nếu bạn đang gọi GetTable() từ nhiều luồng cùng một lúc, điều này gợi ý bạn đang sử dụng một ngữ cảnh dữ liệu duy nhất cho toàn bộ ứng dụng, đó không phải là một ý tưởng hay. Ngoài ra, không sử dụng cùng một bối cảnh dữ liệu nếu bạn đang thực thi các tác vụ song song.

+1

Tôi đã chuyển đơn đăng ký sang EF nhưng có thể cung cấp một số tham khảo một số phương pháp hay nhất về cách sử dụng datacontext. – Tassadaque

+0

@Tassadaque Tôi chưa có đủ kinh nghiệm với EF, nhưng tôi nghĩ rằng các nguyên tắc tương tự áp dụng: - Đừng để nhiều hơn một luồng truy cập vào bối cảnh dữ liệu cùng một lúc. - Sử dụng ngữ cảnh dữ liệu mới cho mỗi mục công việc (có thể là yêu cầu, lệnh từ giao diện người dùng, v.v.). – ErikHeemskerk

+0

nếu tôi khởi tạo datacontext trong mỗi kho lưu trữ mycontainer context = new mycontainer(); sau đó nhiều hơn một chủ đề sẽ không thể truy cập vào datacontext AM tôi phải không ?. Tôi có tất cả quyền truy cập vào cơ sở dữ liệu thông qua các kho lưu trữ – Tassadaque

2

Tôi có cùng một vấn đề. Tôi đã giải quyết nó. Thực ra tôi có một thuộc tính trùng lặp có cùng tên trong ViewModel của tôi. Một thuộc tính nằm trong BaseViewModel và một thuộc tính khác có nguồn gốc Model.

Ví dụ

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


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

Tôi đã thay đổi chúng như

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


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

Bây giờ nó đang làm việc tốt.

0

Tôi gặp vấn đề tương tự trong EF 4.1. với một ứng dụng hiện có. Điều gì đã xảy ra? EF 4.1 yêu cầu khung .net 4.0. Bản cập nhật Windows đã thay thế khung .net 4.0 bằng 4.5 và tôi nhận được lỗi tương tự mà bạn gặp phải. Giải pháp là gỡ cài đặt .net 4.5 và cài đặt .net 4.0. Trên máy sản xuất, bạn nên đặt các cửa sổ để bỏ qua bản cập nhật thành 4.5.

Các vấn đề liên quan