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

user650922
fonte
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.

Aliostad
fonte
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.

atulpatel.mca
fonte
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;}
Hal
fonte
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 ​​..

CuriousBenjamin
fonte
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">
Jason Goemaat
fonte
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

Mina Gabriel
fonte
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.

user650922
fonte
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.

bvoleti
fonte
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; }
Jeremy Cook
fonte
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; }
Jeremy Cook
fonte
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.

JasonWilczak
fonte
1

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

abiNerd
fonte
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.

Ahmet Remzi EKMEKCI
fonte
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.

Mariusz
fonte
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)

AlfredBauer
fonte
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.

kubajs
fonte
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
user9375338
fonte
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.

Adeel Shekhani
fonte
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.

Sanjib Dhar
fonte
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.

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

LuTheZy
fonte