Um item com a mesma chave já foi adicionado


135

Eu recebo esse erro sempre que envio o formulário e o método de ação não está sendo chamado por causa disso:

Um item com a mesma chave já foi adicionado.

E os detalhes da exceção:

[ArgumentException: um item com a mesma chave já foi adicionado.]
System.ThrowHelper.ThrowArgumentException (recurso ExceptionResource) +52
System.Collections.Generic.Dictionary`2.Insert (chave TKey, valor TValue, adição booleana) +9382923 System .Linq.Enumerable.ToDictionary (fonte IEnumerable`1, Func`2 keySelector, Func`2 elementSelector, comparador IEqualityComparer`1) +252
System.Linq.Enumerable.ToDictionary (IEnumerable`1 fonte, Func`2 keySelector, IEqualityComparer`1 comparador) +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, Modelo de objeto) +98 System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +548 System.Web.Mvc.ControllerActionInvoker.GetParameterValue (ControllerContext controllerContextDesDescription)
System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext ControllerContext, ModelBindingContext bindingContext) +2504


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 () .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, marca de objeto) +54
System.Web.Mvc.Async.AsyncResultWrapper. Fim (IAsyncResult asyncResult, marca de objeto) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest (resultado de IAsyncResult) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (etapa IExecutionStep, booleana e concluída de forma síncrona) +184

Ver pagina

<%@ 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
Você precisa adicionar mais contexto a isso. Mostre-nos o código do controlador e descreva as ações exatas que você está executando. Faça um pouco de depuração por conta própria, para que suas perguntas sejam mais detalhadas e não apenas pedaços gigantes de código / pilha.
Chev

Verifiquei meu JSON que estava postando muito de perto e encontrei uma propriedade duplicada - uma identificação do cliente e uma identificação do cliente - por meio de um erro de digitação em javascript que ambas as propriedades foram adicionadas ao JSON que eu estava postando; portanto, apenas um heads-up que resolveu esse problema mim.
AVH 25/09

Respostas:


225

Provavelmente , você tem um modelo que contém a mesma propriedade duas vezes . Talvez você esteja usando newpara ocultar a propriedade base.

A solução é substituir a propriedade ou usar outro nome.

Se você compartilhar seu modelo, poderemos elaborar mais.


16
Em C #, digamos, se você tiver variável1 e Variável1 (isso gerará o erro). Além disso, verifique se não há nenhum nome EDMX semelhantes (coluna da tabela tem "moeda", uma das Propriedades Nome da Navegação tinha "Moeda")
Robert Koch

7
@Naveen Ótimo, é fixo! Vejo que como isso pode ser compilado, mas gera erro aqui. Algumas partes da estrutura (diferentemente do C #) não diferenciam maiúsculas de minúsculas.
Aliostad 6/03/12

9
Alguém saberia identificar qual é "a mesma chave?"
precisa saber é o seguinte

1
Comecei a obtê-lo depois de mexer em alguns modelos de exibição (adicionamos uma propriedade Id). A falha foi que o JS já estava colocando um "id" (ID em minúsculas) no objeto para algum gerenciamento da interface do usuário, mas ao enviar, o objeto JSON tinha as propriedades "Id" e "id", que mapeiam a mesma chave em Fichário de modelo do ASP.NET, daí esse erro.
Svend

1
PS: isso é permitido no MVC3, mas não no MVC5. Não sei por que isso foi alterado.
Julian

20

Eu tive o mesmo problema e foi assim que resolvi. Eu tinha uma propriedade duplicada com o mesmo nome no meu ViewModel. Uma propriedade estava em BaseViewModel e outra em Model derivado.

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


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

Eu mudei isso para

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


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

Agora está funcionando bem.


Obrigado, apenas uma rápida fyi, isso também ocorre mesmo se a base eo modelo tem o mesmo nome do atributo com diferente caso por exemplo Base: Usuário, Modelo: usuário
Richard Housham

12

Eu tive um problema semelhante e descobri que era porque eu tinha uma propriedade pública com nome semelhante (que deveria ter sido privado) que diferia apenas no caso.

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

deveria ter ficado

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

12

Eu tinha duas propriedades do modelo como esta

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

é estranho que ele jogou esse erro para esses 2 haha ​​..


6

Eu tive o problema não no meu modelo C #, mas no objeto javascript que eu estava postando usando AJAX. Estou usando Angular para ligação e tinha um Notescampo em maiúsculas na página enquanto meu objeto C # esperava letras minúsculas notes. Um erro mais descritivo seria bom.

C #:

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

Angular / Javascript:

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

2
É uma resposta um pouco diferente, nenhuma das minhas classes C # tem propriedades duplicadas com casos diferentes, mas o JSON que estava sendo enviado ao meu controlador tinha. Pensei que pode vir a calhar com outras pessoas procurando pelo mesmo problema se eles não conseguem encontrar o problema no seu código C # ..
Jason Goemaat

O mesmo que Goematt. O objeto JSON que estava sendo enviado tinha nomes duplicados, embora o objeto c # ao qual eu estava vinculando ignorasse completamente essas chaves, ele ainda falhou. Isso é idiota, talvez até um bug na minha mente. Como não estou controlando o objeto JSON que está sendo enviado, não posso responder pelo que todos os campos extras estão sendo enviados.
Kukabuka

5

Eu tive o mesmo problema, estava foreachfazendo um loop sobre meu objeto e adicionando o resultado em um Dictionary<string, string>e eu tinha um `Duplicar na chave do banco de dados

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

        }

item.x teve um valor duplicado


3

Eu encontrei a resposta. Foi por causa das variáveis. Como int a e string a. havia duas variáveis ​​com o mesmo nome.


1

Aqui está o que eu fiz para descobrir a chave que estava sendo adicionada duas vezes. Fiz o download do código-fonte em http://referencesource.microsoft.com/DotNetReferenceSource.zip e configurei o VS para depurar a fonte da estrutura. O Dictionary.cs aberto no VS executou o projeto, após o carregamento da página, adicionou uma depuração na linha ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);e conseguiu ver o valor da 'chave'. Percebi que no JSON uma letra de uma variável estava em maiúscula, mas no meu modelo era minúscula. Corrigi o modelo e agora o mesmo código funciona.


1

Eu bati isso no MVC 5 e no Visual Studio Express 2013. Eu tinha duas propriedades IndexAttributecomo abaixo. Comentar um deles e recompilar resultou no andaime do controlador MVC 5 com visualizações, usando o Entity Framework com êxito. Misteriosamente, quando descomentei o atributo, recompilei e tentei novamente, o andaime funcionou perfeitamente.

Talvez o modelo de dados da entidade subjacente ou "algo" tenha sido armazenado em cache / corrompido, e remover e adicionar novamente o IndexAttributesimplesmente desencadeou uma reconstrução desse "algo".

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

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

1

No MVC 5, descobri que comentar temporariamente as referências a um modelo do Entity Framework e recompilar o lado do projeto causavam esse erro ao andaimes. Depois de terminar o andaime, descomente o código.

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

1

Gostaria de adicionar uma resposta que não vejo aqui. Está muito relacionado à resposta aceita, no entanto, eu não tinha propriedades duplicadas no meu modelo, era um problema com o meu Javascript.

Eu estava fazendo um salvamento do Ajax, onde estava reconstruindo o modelo para enviar de volta ao servidor. Quando inicializei a página, configurei meu modelo original para uma variável:

var currentModel = result.Data;

My result.Datatem uma propriedade:result.Data.Items

Então, algum tempo depois, faço algumas coisas e quero salvar, via Ajax. Parte do processo é pegar uma matriz de algum processo paralelo e configurá-la para minha currentModel.Itemspropriedade e enviar currentModelpara o servidor.

No meu Javascript, no entanto, fiz isso:

currentModel.items = getData();

Eu não peguei, mas no Visual Studio, ele irá minúscula a primeira letra para as propriedades Javascript (também pode ser uma coisa do ReSharper). Em seguida, recebi o erro exato postado pelo OP ao tentar salvar porque o currentModel agora possui currentModel.itemsANDcurrentModel.Items

Uma simples mudança de "itens" para "Itens" resolveu o problema.


1

Meu problema era que eu tinha uma @ Url.Action e enviava um valor para a mesma propriedade duas vezes


1

No meu caso, simplesmente quando você compila o código, ele funciona muito bem. Mas chamar um de um campo estático de uma classe estática que possui um dicionário como o exemplo de código gera uma exceção.

Código de amostra

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

Explicação O ADict adicionou a chave "test" duas vezes. Portanto, quando você chama a classe estática, ela lança a exceção.


0

Eu tive o mesmo problema. Pareceu-me depois de migrar para o MVC 5 do MVC 3.

Eu tinha um modelo de editor personalizado e precisava usá-lo dessa maneira antes:

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

Para resolver o problema, tive que remover o ViewDataobjeto que estava passando . Então, no final, eu tive:

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

Espero que ajude.


0

Eu tive o mesmo erro. E depois que eu já pensei que minha mente estava quebrada, porque havia renomeado quase todas as propriedades de meus modelos, a solução foi excluir uma referência em Todos os controles de sincronização e adicionar referências aos controles individuais desses controles. (De Nuget)


0

No meu caso, a raiz do problema era o nome da propriedade duplicado no cliente json, que diferia apenas pela distinção entre maiúsculas e minúsculas.


0

Outra maneira de encontrar esse erro é de um conjunto de dados com colunas sem nome . O erro é lançado quando o conjunto de dados é serializado no JSON.

Esta declaração resultará em erro:

select @column1, @column2

A adição de nomes de colunas impedirá o erro:

select @column1 as col1, @column2 as col2

0

Eu tive o mesmo erro, mas b / c de razão diff. Usando estrutura de entidade. Mais uma coisa que preciso adicionar aqui antes de compartilhar meu código e solução, eu tinha um ponto de interrupção no método do controlador, mas ele não estava funcionando lá, apenas lançando a exceção 500 erro interno do servidor.

Eu estava postando dados do modo de exibição no controlador através do ajax (http post). O modelo que eu esperava como parâmetro era uma classe. Foi herdado com alguma outra classe.

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

e em vista

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

Basta remover os campos duplicados da classe PurchaseOrder e funcionou como um encanto.


0

Eu tive o mesmo erro. Quando verifico o código, descobri que declarar a solicitação "GET" no meu lado angular (fonte) e declarar a solicitação "POST" no lado do ASP.net (back-end). Defina POST / GET para qualquer um dos dois lados. Então resolveu o erro.


0

Eu enfrentei exceção semelhante. Verifique se todas as colunas possuem nomes de cabeçalho (na consulta selecionada no banco de dados) com nomes de propriedades exatamente correspondentes na classe de modelo.


0

Eu tive esse problema no DBContext. Erro ao tentar executar um banco de dados de atualização no console do Package Manager para adicionar uma migração:

Status público virtual do IDbSet {get; conjunto; }

O problema era que o tipo e o nome eram os mesmos. Eu mudei para:

estatutos públicos virtuais do IDbSet {get; conjunto; }

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.