같은 키를 가진 아이템이 이미 추가되었습니다


135

양식을 제출할 때마다이 오류가 발생하며이 때문에 조치 메소드가 호출되지 않습니다.

같은 키를 가진 아이템이 이미 추가되었습니다.

예외 정보 :

[ArgumentException : 동일한 키를 가진 항목이 이미 추가되었습니다.]
System.ThrowHelper.ThrowArgumentException (ExceptionResource resource) +52
System.Collections.Generic.Dictionary`2.Insert (TKey 키, TValue 값, 부울 추가) +9382923 시스템 .Linq.Enumerable.ToDictionary (IEnumerable`1 소스, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 비교기) +252
System.Linq.Enumerable.ToDictionary (IEnumerable`1 소스, Func`2 키 선택기, IEqualityComparer`1
비교기 ) +91 System.Web.Mvc.ModelBindingContext.get_PropertyMetadata () +228 System.Web.Mvc.DefaultModelBinder.BindProperty (ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +392
System.Web.Mvc.DefaultModelBinder.BindProperties (ControllerContext controllerContext, ModelBindingContext bindingContext) +147
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +98
System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext) controllerContext, ModelBindingContext bindingContext) +2504
System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +548
System.Web.Mvc.ControllerActionInvoker.GetParameterValue (ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +473
System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +830 System.Web.Mvc.Controller.ExecuteCore () +136 시스템 .Web.Mvc.ControllerBase.Execute (RequestContext requestContext) +111
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute (RequestContext requestContext) +39
System.Web.Mvc. <> c__DisplayClass8.b__4 () +65 System.Web.Mvc.Async. <> c__DisplayClass1.b__0 () +44 System.Web.Mvc.Async. <> c__DisplayClass8`1.b__7 (IAsyncResult _ ) +42 System.Web.Mvc.Async.WrappedAsyncResult`1.End () +141 System.Web.Mvc.Async.AsyncResultWrapper.End (IAsyncResult asyncResult, Object tag) +54
System.Web.Mvc.Async.AsyncResultWrapper. 끝 (IAsyncResult asyncResult, 개체 태그) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest (IAsyncResult 결과) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (IExecutionStep 단계, Boolean & completedSynchronously) +184

ViewPage

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/XYZ.Master"
    Inherits="System.Web.Mvc.ViewPage<XYZ.Models.Admin.AdminSegmentCommissionsModel>" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
        Create
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
        <% using (Html.BeginForm()) {%>    
            <div class="box3">
                <div class="userinfo">
                    <h3>Admin Segment Commissions</h3>
                </div>
                <div class="buttons-panel">
                    <ul>
                       <li>
                           <input type="submit" value="Save" class="save" />
                       </li>
                       <li>
                           <%:Html.ActionLink("Cancel", "Index", new { controller = "AdminSegmentCommissions" }, new { @class = "cancel" })%>
                           <%--<input type="button" value="Cancel" class="cancel" onclick="document.location.href='/AirlineLedgerTransactionReceiver/Index'" />--%>
                       </li>
                   </ul>
               </div>
           </div>
           <div class="row-1">
               <div class="form-box1 round-corner">
                   <div class="form-box1-row">
                       <div class="form-box1-row-content float-left">
                           <div>
                               <label>
                                   <%: Html.LabelFor(model => model.FromSegmentNumber) %></label>
                                   <%: Html.TextBoxFor(model => model.FromSegmentNumber) %>
                                   <%: Html.ValidationMessageFor(model => model.FromSegmentNumber) %>
                          </div>
                      </div>
                  </div>
              </div>
          </div>
      <%} %>


2
이에 대한 컨텍스트를 더 추가해야합니다. 컨트롤러 코드를 보여주고 수행중인 정확한 조치를 설명하십시오. 약간의 코드 / 스택 덩어리가 아니라 더 자세한 질문이되도록 약간의 디버깅을 스스로 수행하십시오.
Chev

내 JSON을 매우 밀접하게 게시하고 있으며 자바 스크립트 오타를 통해 중복 속성 (하나는 철자 CustomerID와 하나는 철자 CustomerId)을 발견했습니다. 두 속성 모두 내가 게시 한 JSON에 추가되었습니다. 나를.
AVH

답변:


225

아마도 같은 속성을 두 번 포함하는 모델이 있을 것 입니다. 아마도 new기본 속성을 숨기는 데 사용 하고있을 것입니다.

해결책은 속성을 재정의하거나 다른 이름을 사용하는 것입니다.

모델을 공유하면 더 정교해질 수 있습니다.


16
C #에서는 variable1과 Variable1이 있으면 오류가 발생합니다. 또한 유사한 edmx 이름이 없는지 확인하십시오 (표 열에는 "CURRENCY", 탐색 속성 이름 중 하나는 "통화"임)
Robert Koch

7
@Naveen 대단하다! 나는 이것이 어떻게 컴파일 할 수는 있지만 오류를 던질 수 있음을 알았습니다. C #과 달리 프레임 워크의 일부는 대소 문자를 구분하지 않습니다.
Aliostad

9
누군가 "같은 키"를 식별하는 방법을 알고 있습니까?
ClayKaboom

1
몇 가지보기 모델 (Id 속성 추가)로 바이올린을 피운 후에 이것을 시작했습니다. 잘못된 점은 JS가 이미 UI 관리를 위해 객체에 "id"(소문자 ID)를 넣었으나 제출할 때 JSON 객체에 "Id"및 "id"속성이 모두 있는데 이는 동일한 키에 매핑됩니다. ASP.NET의 모델 바인더이므로이 오류가 발생합니다.
Svend

1
추신 : MVC3에서는 허용되지만 MVC5에서는 허용되지 않습니다. 왜 이것이 변경되었는지 확실하지 않습니다.
율리우스

20

나는 같은 문제가 있었고 이것이 내가 그것을 해결 한 방법입니다. 내 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; }
}

이제는 잘 작동합니다.


사용자 : 모델 사용자 : 감사합니다, 그냥 빨리 참고로,이 또한베이스와 모델이 서로 다른 경우, 예를 들어 자료와 동일한 속성 이름이 경우에도 발생합니다
리처드 Housham

12

나는 비슷한 문제를 겪었을 뿐인데, 비슷한 경우에 이름이 다른 공공 재산 (사적 이었어 야했던)이 있었기 때문에 그 경우에만 달랐다는 것을 알았다.

public string PropertyName {get;set;} // actually set propertyName, get propertyName
public string propertyName {get;set;}

이어야했다

public string PropertyName {get;set;} 
private string propertyName {get;set;}

12

나는이 같은 2 가지 모델 속성을 가지고

public int LinkId {get;set;}
public int LinkID {get;set;}

이 2 haha에 대해이 오류가 발생하는 것은 이상합니다.


6

내 C # 모델에는 문제가 없지만 javascript 객체에는 AJAX를 사용하여 게시하고있었습니다. 바인딩에 Angular를 사용하고 Notes있으며 C # 객체가 소문자를 기대하는 동안 페이지에 대문자 필드가 notes있습니다. 더 설명적인 오류는 확실히 좋을 것입니다.

씨#:

class Post {
    public string notes { get; set; }
}

각도 / 자바 스크립트 :

<input ng-model="post.Notes" type="text">

2
약간 다른 대답입니다. 내 C # 클래스에는 사례가 다른 중복 속성이 없지만 컨트롤러로 전송되는 JSON은 없습니다. ... 그들은 자신의 C # 코드에서 문제를 찾을 수없는 경우이 같은 문제를 검색하는 다른 사람들과 편리하게 사용할 수 있습니다 생각
제이슨 Goemaat

Goematt와 동일합니다. 바인딩 된 c # 객체가 해당 키를 완전히 무시하더라도 전송중인 JSON 객체의 이름이 중복되었습니다. 여전히 실패했습니다. 이것은 멍청한 것일 수도 있고 아마도 내 마음에 버그 일 수도 있습니다. 전송되는 JSON 객체를 제어하지 않으므로 모든 추가 필드가 전송되는 것을 설명 할 수 없습니다.
kukabuka

5

나는 같은 문제가 있었다. 나는 foreach내 객체를 반복하고 결과를 a에 추가 Dictionary<string, string>하고 데이터베이스에서 키에`Duplicate했다.

 foreach (var item in myObject)
        {
            myDictionary.Add(Convert.ToString(item.x), 
                                   item.y);

        }

item.x 중복 가치가 있었다


3

나는 대답을 찾았습니다. 변수 때문이었습니다. int a와 string a처럼 같은 이름을 가진 두 개의 변수가있었습니다.


1

여기에 두 번 추가 된 키를 찾기 위해 수행 한 작업이 있습니다. http://referencesource.microsoft.com/DotNetReferenceSource.zip 에서 소스 코드를 다운로드하고 프레임 워크 소스를 디버깅하도록 VS를 설정했습니다. VS에서 Dictionary.cs를 열어 프로젝트를 실행하고 페이지가로드되면 라인에 디버그를 추가 ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);하고 '키'값을 볼 수있었습니다. JSON에서 변수의 한 글자는 대문자이지만 내 모델에서는 소문자라는 것을 깨달았습니다. 모델을 수정했으며 이제 동일한 코드가 작동합니다.


1

MVC 5와 Visual Studio Express 2013에서이 문제를 해결했습니다 IndexAttribute. 아래와 같은 두 가지 속성이 있습니다. 그중 하나를 주석 처리하고 다시 컴파일하면 Entity Framework를 사용하여 뷰가있는 MVC 5 컨트롤러를 스캐 폴딩했습니다. 의문의 여지없이, 속성의 주석 처리를 제거하고 다시 컴파일 한 후 다시 시도했을 때 스캐 폴더가 제대로 작동했습니다.

아마도 기본 엔터티 데이터 모델 또는 "무언가"가 캐시 / 손상되었고 IndexAttribute단순히 제거하고 다시 추가하면 해당 "무언가"가 재 구축되었습니다.

[Index(IsUnique = true)]
public string Thing1 { get; set; }

[Index(IsUnique = true)]
public string Thing2 { get; set; }

1

MVC 5에서 Entity Framework 모델에 대한 참조를 일시적으로 주석 처리하고 프로젝트 측을 다시 컴파일하면 스캐 폴딩 시이 오류가 발생했습니다. 스캐 폴딩을 마치면 코드의 주석을 해제합니다.

public Guid CreatedById { get; private set; }
// Commented out so I can scaffold: 
// public virtual UserBase CreatedBy { get; private set; }

1

여기에 표시되지 않는 답변을 추가하고 싶습니다. 허용 된 답변과 매우 관련이 있지만 모델에 속성이 중복되지 않았으므로 Javascript에 문제가있었습니다.

서버로 다시 보내기 위해 모델을 재구성하는 Ajax 저장을하고있었습니다. 페이지를 처음 초기화했을 때 원래 모델을 변수로 설정했습니다.

var currentModel = result.Data;

result.Data재산이 있습니다 :result.Data.Items

그래서 얼마 후 Ajax를 통해 몇 가지 일을하고 저장하고 싶습니다. 프로세스의 일부는 일부 사이드 프로세스에서 배열을 가져 와서 내 currentModel.Items속성으로 설정 currentModel하고 서버로 보내는 것입니다.

그러나 Javascript에서는 대신 다음과 같이했습니다.

currentModel.items = getData();

나는 그것을 잡지 못했지만 Visual Studio에서는 Javascript 속성의 첫 글자를 자동으로 소문자로 바꿉니다 (ReSharper 일 수도 있음). 그런 다음 currentModel에 currentModel.itemsAND 가 있기 때문에 저장하려고 할 때 OP에 게시 된 정확한 오류가 발생했습니다.currentModel.Items

"항목"에서 "항목"으로 간단히 변경하면 문제가 해결되었습니다.


1

내 문제는 @ Url.Action이 있고 동일한 속성 값을 두 번 보냈다는 것입니다.


1

필자의 경우 코드를 컴파일 할 때 정상적으로 실행됩니다. 그러나 샘플 코드와 같은 사전이있는 정적 클래스의 정적 필드 중 하나를 호출하면 예외가 발생합니다.

샘플 코드

public static AClass
{
    public static Dictionary<string, string> ADict = new Dictionary<string, string>()
        {
            {"test","value1"},{"test","value2"},
        };
}

설명 중덕는 "테스트"키를 두 번 추가했다. 따라서 정적 클래스를 호출하면 예외가 발생합니다.


0

나는 같은 문제가 있었다. MVC 3에서 MVC 5로 마이그레이션 한 후 나에게 나타났습니다.

사용자 정의 편집기 템플릿이 있었고 전에 다음과 같이 사용해야했습니다.

@Html.EditorFor(model => model.MyProperty, "MyCustomTemplateName", "MyPropertyField", this.ViewData)

문제를 해결하기 위해 통과하는 ViewData객체 를 제거해야했습니다 . 결국 나는 가지고 있었다 :

@Html.EditorFor(model => model.MyProperty, "MyCustomTemplateName", "MyPropertyField")

도움이 되길 바랍니다.


0

나는 같은 오류가 있었다. 그리고 이미 내 마음이 깨 졌다고 생각한 후에 거의 모든 모델 속성의 이름을 바 꾸었으므로 솔루션은 모든 동기화 제어에 대한 하나의 참조를 삭제 하고이 컨트롤의 개별 컨트롤에 대한 참조를 추가했습니다. (누겟에서)


0

제 경우에는 문제의 근본이 대소 문자 구분에 따라 다른 클라이언트 json의 중복 속성 이름이었습니다.


0

이 오류가 발생하는 또 다른 방법은 명명되지 않은 열이 있는 데이터 집합 에서 발생합니다 . 데이터 세트가 JSON으로 직렬화되면 오류가 발생합니다.

이 문장은 오류가 발생합니다 :

select @column1, @column2

열 이름을 추가하면 오류가 발생하지 않습니다.

select @column1 as col1, @column2 as col2

0

나는 같은 오류가 있지만 diff reason의 b / c가 있습니다. 엔터티 프레임 워크 사용. 코드와 솔루션을 공유하기 전에 여기에 추가해야 할 한 가지 더, 컨트롤러 메소드에 중단 점이 있었지만 중단되지 않았으며 예외 500 내부 서버 오류가 발생했습니다.

아약스 (http post)를 통해 뷰에서 컨트롤러로 데이터를 게시하고있었습니다. 매개 변수로 기대했던 모델은 클래스였습니다. 그것은 다른 클래스와 함께 상속되었습니다.

public class PurchaseOrder : CreateUpdateUserInfo
    {
        public PurchaseOrder()
        {
            this.Purchase_Order_Items = new List<clsItem>();
        }

        public int purchase_order_id { get; set; }
        public Nullable<int> purchase_quotation_id { get; set; }
        public int supplier_id { get; set; }
        public decimal flat_discount { get; set; }
        public decimal total { get; set; }
        public decimal net_payable { get; set; }
        public bool is_payment_complete { get; set; }
        public decimal sales_tax { get; set; }
        public DateTime CreatedOn { get; set; }
        public int CreatorUserID { get; set; }
        public DateTime UpdatedOn { get; set; }
        public int UpdatorUserID { get; set; }
        public bool IsDeleted { get; set; }
        public List<clsItem> Purchase_Order_Items { get; set; }
    }

 public class CreateUpdateUserInfo
    {
        public DateTime CreatedOn { get; set; }
        public int CreatorUserID { get; set; }
        public string CreatorUserName { get; set; }
        public DateTime UpdatedOn { get; set; }
        public int UpdatorUserID { get; set; }
        public string UpdatorUserName { get; set; }
        public bool IsDeleted { get; set; }
    }

그리고보기

                var model = {
                supplier_id : isNaN($scope.supplierID) || 0 ? null : $scope.supplierID,
                flat_discount : 0,
                total : $scope.total,
                net_payable :  $scope.total,
                is_payment_complete :  true,
                sales_tax:0,
                Purchase_Order_Item: $scope.items
            };
            var obj = {
                method: 'POST',
                url: 'Purchase/SaveOrder',
                dataType: 'json',
                data: JSON.stringify(model),
                headers: { "Content-Type": "application/json" }
            };

            var request = $rootScope.AjaxRequest(obj);
            request.then(function (response) {
                var isError = response.data.MessageType === 1;
                $rootScope.bindToaster(response.data.MessageType,response.data.Message);
                //$('html, body').animate({ scrollTop: 0 }, 'slow');
                if(!isError){
                    //$scope.supplierID =undefined;
                }
            }, function (response) {
                $rootScope.bindToaster(2,response.data);
                console.log(response);
            });

PurchaseOrder 클래스에서 중복 필드를 간단히 제거하면 매력처럼 작동했습니다.


0

나는 같은 오류가 있었다. 코드를 확인할 때 각도 (글꼴 끝) 쪽에서 "GET"요청을 선언하고 ASP.net (백엔드) 쪽에서 "POST"요청을 선언하는 것을 발견했습니다. POST / GET을 양쪽에 설정하십시오. 그런 다음 오류를 해결했습니다.


0

나는 비슷한 예외에 직면했다. 모든 열에 모델 클래스의 속성 이름과 정확히 일치하는 헤더 이름 (데이터베이스의 선택 쿼리의 헤더 이름)이 있는지 확인하십시오.


0

DBContext 에서이 문제가있었습니다. 패키지 관리자 콘솔에서 업데이트 데이터베이스를 실행하여 마이그레이션을 추가하려고 할 때 오류가 발생했습니다.

공개 가상 IDbSet 상태 {get; 세트; }

문제는 유형과 이름이 동일하다는 것이 었습니다. 나는 그것을 다음과 같이 바꿨다.

공개 가상 IDbSet 상태 {get; 세트; }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.