Un élément avec la même clé a déjà été ajouté


135

J'obtiens cette erreur chaque fois que je soumets le formulaire et que la méthode d'action n'est pas appelée à cause de cela:

Un élément avec la même clé a déjà été ajouté.

Et les détails de l'exception:

[ArgumentException: Un élément avec la même clé a déjà été ajouté.]
System.ThrowHelper.ThrowArgumentException (ressource ExceptionResource) +52
System.Collections.Generic.Dictionary`2.Insert (clé TKey, valeur TValue, ajout booléen) +9382923 System .Linq.Enumerable.ToDictionary (IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparateur) +252
System.Linq.Enumerable.ToDictionary (IEnumerable`1 source, Func`2 keySelector`1 comparer) +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, modèle d'objet) +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.GetParameterValueControllerActionInvoker.GetParameterValue paramètre (ControllerContext)
System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +830 System.Webore.Mvc. .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, balise Object) +54
System.Web.Mvc.Async.AsyncResultWrapper. End (IAsyncResult asyncResult, balise Object) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.Rcestrec resultat38.
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (IExecutionStep step, Boolean & completedSynchronously) +184

Voir page

<%@ 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
Vous devez ajouter plus de contexte à cela. Montrez-nous le code du contrôleur et décrivez les actions exactes que vous effectuez. Faites un peu de débogage par vous-même afin que vos questions soient plus verbeuses et pas seulement des morceaux géants de code / pile.
Chev

J'ai vérifié mon JSON que je publiais de très près et j'ai trouvé une propriété en double - un CustomerID orthographié et un CustomerId orthographié - via une faute de frappe javascript, les deux propriétés avaient été ajoutées au JSON que je publiais, donc juste un avertissement qui a résolu ce problème pour moi.
AVH

Réponses:


225

Très probablement , vous avez un modèle qui contient deux fois la même propriété . Peut-être que vous utilisez newpour masquer la propriété de base.

La solution consiste à remplacer la propriété ou à utiliser un autre nom.

Si vous partagez votre modèle, nous serons en mesure d'élaborer davantage.


16
En C #, disons, si vous avez variable1 et Variable1 (cela lèvera l'erreur). Vérifiez également qu'il n'y a pas de noms edmx similaires (la colonne de la table a "CURRENCY", l'un des noms des propriétés de navigation a "Currency")
Robert Koch

7
@Naveen Super c'est corrigé! Je vois comment cela pourrait compiler mais générer une erreur ici. Certaines parties du framework (contrairement à C #) sont insensibles à la casse.
Aliostad

9
Est-ce que quelqu'un saurait identifier quelle est «la même clé»?
ClayKaboom

1
J'ai commencé à l'obtenir après avoir manipulé certains modèles de vue (ajouté une propriété Id). Le problème était que le JS mettait déjà un "id" (id en minuscule) sur l'objet pour une certaine gestion de l'interface utilisateur, mais lors de la soumission, l'objet JSON avait à la fois les propriétés "Id" et "id", qui correspondent à la même clé dans Le classeur de modèle d'ASP.NET, d'où cette erreur.
Svend

1
PS: ceci est autorisé dans MVC3, mais pas dans MVC5. Je ne sais pas pourquoi cela a été changé.
Julian

20

J'ai eu le même problème et c'est ainsi que je l'ai résolu. J'avais une propriété en double avec le même nom dans mon ViewModel. Une propriété était dans BaseViewModel et une autre dans un modèle dérivé.

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


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

J'ai changé ça en

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


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

Maintenant ça fonctionne bien.


Merci, juste un petit fyi, cela se produit également même si la base et le modèle ont le même nom d'attribut avec une casse différente, par exemple Base: User, Model: user
Richard Housham

12

J'ai eu un problème similaire et j'ai trouvé que c'était parce que j'avais une propriété publique du même nom (qui aurait dû être privée) qui ne différait que par cas.

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

aurait du être

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

12

J'ai eu 2 propriétés de modèle comme celle-ci

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

c'est étrange qu'il ait jeté cette erreur pour ces 2 haha ​​..


6

J'ai eu le problème non pas dans mon modèle C #, mais dans l'objet javascript que je publiais en utilisant AJAX. J'utilise Angular pour la liaison et j'avais un Noteschamp en majuscule sur la page alors que mon objet C # attendait des minuscules notes. Une erreur plus descriptive serait certainement bien.

C #:

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

Angulaire / Javascript:

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

2
C'est une réponse légèrement différente, aucune de mes classes C # n'a de propriétés en double avec des cas différents, mais le JSON qui était envoyé à mon contrôleur l'a fait. J'ai pensé que cela pourrait être utile avec d'autres personnes qui recherchent le même problème si elles ne trouvent pas le problème dans leur code C #.
Jason Goemaat

Identique à Goematt. L'objet JSON qui était envoyé avait des noms en double même si l'objet c # auquel je me liais ignorait complètement ces clés, il a toujours échoué. C'est stupide, peut-être même un bug dans mon esprit. Je ne contrôle pas l'objet JSON envoyé, donc je ne peux pas rendre compte de ce que tous les champs supplémentaires sont envoyés.
kukabuka

5

J'ai eu le même problème, je foreachbouclais sur mon objet et j'ajoutais le résultat dans un Dictionary<string, string>et j'avais un `Dupliquer dans la clé de la base de données

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

        }

item.x avait une valeur en double


3

J'ai trouvé la réponse, à cause des variables. Comme int a et string a. il y avait deux variables avec le même nom.


1

Voici ce que j'ai fait pour découvrir la clé qui a été ajoutée deux fois. J'ai téléchargé le code source à partir de http://referencesource.microsoft.com/DotNetReferenceSource.zip et j'ai configuré VS pour déboguer la source du framework. L'ouverture de Dictionary.cs dans VS a exécuté le projet, une fois la page chargée, a ajouté un débogage à la ligne ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);et a pu voir la valeur «clé». J'ai réalisé que dans le JSON, une lettre d'une variable était en majuscule, mais dans mon modèle, elle était en minuscule. J'ai corrigé le modèle et maintenant le même code fonctionne.


1

J'ai frappé ceci dans MVC 5 et Visual Studio Express 2013. J'avais deux propriétés avec un IndexAttributecomme ci-dessous. La mise en commentaire de l'un d'entre eux et la recompilation ont abouti à l'échafaudage du contrôleur MVC 5 avec des vues, en utilisant Entity Framework avec succès. Mystérieusement, quand j'ai décommenté l'attribut, recompilé et réessayé, l'échafaudeur a fonctionné très bien.

Peut-être que le modèle de données d'entité sous-jacent ou "quelque chose" a été mis en cache / corrompu, et la suppression et l'ajout de nouveau ont IndexAttributesimplement déclenché une reconstruction de ce "quelque chose".

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

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

1

Dans MVC 5, j'ai trouvé que le commentaire temporaire des références à un modèle Entity Framework et la recompilation du côté du projet ont résolu cette erreur lors de l'échafaudage. Une fois que j'ai terminé l'échafaudage, je décommente le code.

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

1

Je voudrais ajouter une réponse que je ne vois pas ici. C'est très lié à la réponse acceptée, cependant, je n'avais pas de propriétés dupliquées sur mon modèle, c'était un problème avec mon Javascript.

Je faisais une sauvegarde Ajax où je reconstruisais le modèle pour le renvoyer au serveur. Lorsque j'ai initialisé la page pour la première fois, j'ai défini mon modèle d'origine sur une variable:

var currentModel = result.Data;

Mon result.Dataa une propriété:result.Data.Items

Donc, quelque temps plus tard, je fais des choses et je veux économiser, via Ajax. Une partie du processus consiste à récupérer un tableau d'un processus secondaire et à le définir sur ma currentModel.Itemspropriété et à l'envoyer currentModelau serveur.

Dans mon Javascript, cependant, j'ai fait ceci, à la place:

currentModel.items = getData();

Je ne l'ai pas attrapé, mais dans Visual Studio, la première lettre des propriétés Javascript sera automatiquement minuscule (cela pourrait aussi être une chose ReSharper). Ensuite, j'ai reçu l'erreur exacte publiée par OP lorsque j'ai essayé de sauvegarder car currentModel a maintenant currentModel.itemsETcurrentModel.Items

Un simple changement de "éléments" à "éléments" a résolu le problème.


1

Mon problème était que j'avais une @ Url.Action et j'avais envoyé deux fois une valeur pour la même propriété


1

Dans mon cas, simplement lorsque vous compilez le code, il fonctionne très bien. Mais appeler l'un d'un champ statique d'une classe statique qui a un dictionnaire comme l'exemple de code a, lève l'exception.

Exemple de code

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

Explication ADict a ajouté deux fois la clé "test". Ainsi, lorsque vous appelez la classe statique, elle lève l'exception.


0

J'ai eu le même problème. Il m'est apparu après la migration vers MVC 5 depuis MVC 3.

J'avais un modèle d'éditeur personnalisé et je devais l'utiliser comme ça avant:

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

Pour résoudre le problème, j'ai dû supprimer l' ViewDataobjet qui passait . Donc à la fin j'avais:

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

J'espère que ça aide.


0

J'ai eu la même erreur. Et après avoir déjà pensé que mon esprit était brisé, parce que j'avais renommé presque toutes les propriétés de mes modèles, la solution était de supprimer une référence sur Tous les contrôles de synchronisation et d'ajouter des références aux contrôles individuels de ces contrôles. (De Nuget)


0

Dans mon cas, la racine du problème était le nom de propriété en double dans le client json qui ne différait que par le respect de la casse.


0

Une autre façon de rencontrer cette erreur consiste à utiliser un ensemble de données avec des colonnes sans nom . L'erreur est générée lorsque l'ensemble de données est sérialisé dans JSON.

Cette déclaration entraînera une erreur:

select @column1, @column2

L'ajout de noms de colonne évitera l'erreur:

select @column1 as col1, @column2 as col2

0

J'ai eu la même erreur mais b / c de raison diff. Utilisation du framework Entity. Une dernière chose que je dois ajouter ici avant de partager mon code et ma solution, j'avais un point d'arrêt sur la méthode du contrôleur mais cela ne cassait pas là, juste en lançant une erreur de serveur interne d'exception 500.

Je postais des données de vue au contrôleur via ajax (http post). Le modèle auquel je m'attendais en tant que paramètre était une classe. Il a été hérité avec une autre 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; }
    }

et en vue

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

Simplement supprimé les champs dupliqués de la classe PurchaseOrder et cela a fonctionné comme un charme.


0

J'ai eu la même erreur. Quand je vérifie le code, j'ai trouvé que déclarer la demande «GET» dans mon côté angulaire (font-end) et déclarer la demande «POST» dans le côté ASP.net (back-end). Définissez POST / GET n'importe lequel des deux côtés. Puis résolu l'erreur.


0

J'ai fait face à une exception similaire. Vérifiez si toutes les colonnes ont des noms d'en-tête (à partir de la requête de sélection dans la base de données) avec des noms de propriété exactement correspondants dans la classe de modèle.


0

J'ai eu ce problème sur le DBContext. Vous avez l'erreur lorsque j'ai essayé d'exécuter une base de données de mise à jour dans la console du gestionnaire de package pour ajouter une migration:

État IDbSet virtuel public {get; ensemble; }

Le problème était que le type et le nom étaient les mêmes. Je l'ai changé en:

Statuts IDbSet virtuels publics {get; ensemble; }

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.