Un elemento con la stessa chiave è già stato aggiunto


135

Ottengo questo errore ogni volta che invio il modulo anche il metodo di azione non viene chiamato a causa di questo:

Un elemento con la stessa chiave è già stato aggiunto.

E i dettagli dell'eccezione:

[ArgumentException: un elemento con la stessa chiave è già stato aggiunto.]
System.ThrowHelper.ThrowArgumentException (risorsa ExceptionResource) +52
System.Collections.Generic.Dictionary`2.Insert (chiave TKey, valore TValue, aggiunta booleana) +9382923 Sistema .Linq.Enumerable.ToDictionary (IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) +252
System.Linq.Enumerable.ToDictionary (IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparatore) +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, il modello Object) +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.GetParameterValueDescorDescorDescore
System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +830 System.Web.C. .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, tag oggetto) +54
System.Web.Mvc.Async.AscRes. End (IAsyncResult asyncResult, Tag oggetto) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandlerRequest
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (IExecutionStep step, Boolean & completatoSynchronously) +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
Devi aggiungere più contesto a questo. Mostraci il codice del controller e descrivi le azioni esatte che stai intraprendendo. Esegui un piccolo debug da solo in modo che le tue domande siano più dettagliate e non solo grosse quantità di codice / stack.
Chev,

Ho controllato il mio JSON che stavo postando molto da vicino e ho trovato una proprietà duplicata - uno scritto ID cliente e uno scritto ID cliente - tramite un refuso javascript entrambe le proprietà erano state aggiunte al JSON che stavo postando, quindi solo un avvertimento che ha risolto questo problema per me.
AVH,

Risposte:


225

Molto probabilmente , hai un modello che contiene la stessa proprietà due volte . Forse stai usando newper nascondere la proprietà di base.

La soluzione è sovrascrivere la proprietà o usare un altro nome.

Se condividi il tuo modello, saremmo in grado di elaborare di più.


16
In C #, diciamo, se hai variabile1 e Variabile1 (genererà l'errore). Inoltre, assicurati che non ci siano nomi edmx simili (la colonna della tabella ha "CURRENCY", uno dei nomi delle proprietà di navigazione aveva "Valuta")
Robert Koch

7
@Naveen Ottimo, è stato risolto! Vedo che questo potrebbe essere compilato ma gettare l'errore qui. Alcune parti del framework (a differenza di C #) non fanno distinzione tra maiuscole e minuscole.
Aliostad,

9
Qualcuno saprebbe identificare quale è "la stessa chiave?"
ClayKaboom,

1
Ho iniziato a ottenerlo dopo aver armeggiato con alcuni modelli di vista (aggiunta una proprietà ID). L'errore era che JS stava già inserendo un "id" (id minuscolo) sull'oggetto per una certa gestione dell'interfaccia utente, ma durante l'invio, l'oggetto JSON aveva entrambe le proprietà "Id" e "id", che si associa alla stessa chiave in Raccoglitore di modelli ASP.NET, quindi questo errore.
Svend,

1
PS: questo è consentito in MVC3, ma non in MVC5. Non so perché sia ​​stato modificato.
Julian,

20

Ho avuto lo stesso problema ed è così che l'ho risolto. Avevo una proprietà duplicata con lo stesso nome nel mio ViewModel. Una proprietà era in BaseViewModel e un'altra è nel modello derivato.

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


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

L'ho cambiato in

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


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

Ora funziona benissimo.


Grazie, solo un breve resoconto, questo si verifica anche se la base e il modello hanno lo stesso nome di attributo con caso diverso, ad esempio Base: Utente, Modello: utente
Richard Housham,

12

Ho avuto un problema simile e ho scoperto che era perché avevo una proprietà pubblica con nome simile (che avrebbe dovuto essere privata) che differiva solo nel caso.

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

avrebbe dovuto essere

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

12

Ho avuto 2 proprietà del modello come questo

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

è strano che abbia gettato questo errore per questi 2 haha ​​..


6

Ho avuto il problema non nel mio modello C #, ma nell'oggetto javascript che stavo postando usando AJAX. Sto usando Angular come rilegatura e avevo un Notescampo in maiuscolo sulla pagina mentre il mio oggetto C # si aspettava lettere minuscole notes. Un errore più descrittivo sarebbe sicuramente carino.

C #:

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

Angolare / Javascript:

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

2
È una risposta leggermente diversa, nessuna delle mie classi C # ha proprietà duplicate con casi diversi, ma lo ha fatto il JSON che veniva inviato al mio controller. Ho pensato che potrebbe tornare utile con altre persone che cercano lo stesso problema se non riescono a trovare il problema nel loro codice C # ..
Jason Goemaat,

Come Goematt. L'oggetto JSON che veniva inviato aveva nomi duplicati anche se l'oggetto c # a cui stavo legando stava ignorando completamente quelle chiavi, ma continuava a fallire. Questo è stupido, forse anche un bug nella mia mente. Non sto controllando l'oggetto JSON che viene inviato, quindi non posso tenere conto di ciò che tutti i campi extra vengono inviati.
Kukabuka,

5

Ho avuto lo stesso problema, stavo foreacheseguendo il ciclo sul mio oggetto e aggiungendo il risultato in un Dictionary<string, string>e avevo un `Duplicato nella chiave dal database

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

        }

item.x aveva un valore duplicato


3

Ho trovato la risposta, a causa delle variabili. Come int a e stringa a. c'erano due variabili con lo stesso nome.


1

Ecco cosa ho fatto per scoprire la chiave che veniva aggiunta due volte. Ho scaricato il codice sorgente da http://referencesource.microsoft.com/DotNetReferenceSource.zip e ho installato VS per eseguire il debug del framework del framework. Il file Dictionary.cs aperto in VS ha eseguito il progetto, una volta caricata la pagina, aggiunto un debug sulla riga ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);ed è stato in grado di vedere il valore 'chiave'. Mi sono reso conto che nel JSON una lettera di una variabile era in maiuscolo ma nel mio modello era in minuscolo. Ho corretto il modello e ora funziona lo stesso codice.


1

Ho colpito questo in MVC 5 e Visual Studio Express 2013. Avevo due proprietà con un IndexAttributesimile qui sotto. Commentare uno di questi e ricompilare ha comportato l'impalcatura del controller MVC 5 con viste, utilizzando Entity Framework con successo. Misteriosamente, quando ho decommentato l'attributo, ricompilato e riprovato, l'impalcatura correva bene.

Forse il modello di dati dell'entità sottostante o "qualcosa" è stato memorizzato nella cache / danneggiato e la rimozione e l'aggiunta di altri ha IndexAttributesemplicemente innescato una ricostruzione di quel "qualcosa".

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

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

1

In MVC 5 ho scoperto che commentare temporaneamente i riferimenti a un modello Entity Framework e ricompilare la parte del progetto ha evitato questo errore durante l'impalcatura. Una volta finito il ponteggio, rimuovo il codice.

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

1

Vorrei aggiungere una risposta che non vedo qui. È molto correlato alla risposta accettata, tuttavia non avevo proprietà duplicate sul mio modello, era un problema con il mio Javascript.

Stavo facendo un po 'di salvataggio su Ajax dove stavo ricostruendo il modello per rispedirlo al server. Quando ho inizializzato la pagina per la prima volta ho impostato il mio modello originale su una variabile:

var currentModel = result.Data;

Il mio result.Dataha una proprietà:result.Data.Items

Quindi, qualche tempo dopo, faccio alcune cose e voglio salvare, tramite Ajax. Parte del processo consiste nel prendere un array da un processo laterale e impostarlo sulla mia currentModel.Itemsproprietà e inviarlo currentModelal server.

Nel mio Javascript, invece, l'ho fatto, invece:

currentModel.items = getData();

Non l'ho preso, ma in Visual Studio, verrà automaticamente minuscola la prima lettera per le proprietà Javascript (potrebbe anche essere una cosa ReSharper). Quindi, ho ricevuto l'errore esatto pubblicato da OP quando ho provato a salvare perché currentModel ora ha currentModel.itemsANDcurrentModel.Items

Una semplice modifica da "articoli" a "Articoli" ha risolto il problema.


1

Il mio problema era che avevo un @ Url.Action e avevo inviato due volte un valore per la stessa proprietà


1

Nel mio caso, semplicemente quando compili il codice, funziona alla perfezione. Ma chiamare uno di un campo statico di una classe statica che ha un dizionario come il codice di esempio ha, genera l'eccezione.

Codice di esempio

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

Spiegazione ADict ha il tasto "test" aggiunto due volte. Pertanto, quando si chiama la classe statica, viene generata l'eccezione.


0

Ho avuto lo stesso problema. Mi è sembrato dopo la migrazione a MVC 5 da MVC 3.

Avevo un modello di editor personalizzato e dovevo usarlo in questo modo prima:

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

Per risolvere il problema ho dovuto rimuovere l' ViewDataoggetto di passaggio . Quindi alla fine ho avuto:

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

Spero che sia d'aiuto.


0

Ho avuto lo stesso errore. E dopo che ho già pensato che la mia mente fosse rotta, poiché avevo rinominato quasi tutte le proprietà dei miei modelli, la soluzione era eliminare un riferimento su Tutti i controlli di sincronizzazione e aggiungere riferimenti ai singoli controlli di questi controlli. (Da Nuget)


0

Nel mio caso la radice del problema era il nome della proprietà duplicata nel client json che differiva solo per la distinzione tra maiuscole e minuscole.


0

Un altro modo per riscontrare questo errore è da un set di dati con colonne senza nome . L'errore viene generato quando il set di dati viene serializzato in JSON.

Questa affermazione comporterà un errore:

select @column1, @column2

L'aggiunta di nomi di colonna impedirà l'errore:

select @column1 as col1, @column2 as col2

0

Ho avuto lo stesso errore ma b / c del motivo diff. Utilizzo del framework Entity. Un'altra cosa che devo aggiungere qui prima di condividere il mio codice e la mia soluzione, ho avuto un punto di interruzione sul metodo del controller, ma non si stava rompendo lì, solo lanciando un'eccezione 500 errore interno del server.

Stavo pubblicando i dati dalla vista al controller tramite ajax (http post). Il modello che mi aspettavo come parametro era una classe. È stato ereditato da qualche altra 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 in 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);
            });

Ha semplicemente rimosso i campi duplicati dalla classe PurchaseOrder e ha funzionato come un incantesimo.


0

Ho avuto lo stesso errore. Quando controllo il codice, ho scoperto che dichiara la richiesta "GET" nel mio lato angolare (font-end) e dichiara la richiesta "POST" nel lato ASP.net (back-end). Impostare POST / GET uno su entrambi i lati. Quindi risolto l'errore.


0

Ho affrontato un'eccezione simile. Controllare se tutte le colonne hanno nomi di intestazione (dalla query selezionata nel database) con nomi di proprietà esattamente corrispondenti nella classe del modello.


0

Ho avuto questo problema sul DBContext. Ho ricevuto l'errore quando ho provato a eseguire un database di aggiornamento nella console di Package Manager per aggiungere una migrazione:

stato IDbSet virtuale pubblico {get; impostato; }

Il problema era che il tipo e il nome erano gli stessi. L'ho cambiato in:

stati pubblici IDbSet virtuali {get; impostato; }

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.