Item dengan kunci yang sama telah ditambahkan

140

Saya mendapatkan kesalahan ini setiap kali saya mengirimkan formulir juga metode tindakan tidak dipanggil karena ini:

Item dengan kunci yang sama telah ditambahkan.

Dan detail pengecualiannya:

[ArgumentException: Item dengan kunci yang sama telah ditambahkan.]
System.ThrowHelper.ThrowArgumentException (ExceptionResource resource) +52
System.Collections.Generic.Dictionary`2.Insert (kunci TKey, nilai TValue, Boolean add) +9382923 Sistem .Linq.Enumerable.ToDictionary (IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) +252
System.Linq.Enumerable.ToDictionary (sumber IEnumerable`1, Func`2 keySelector, IEqualityComparer` pembanding) +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.Model.DefaultModelBinder.BindComplex.Model 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 System .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 Objek) +54
System.Web.Mvc.Async.AsyncResultWrapper. Akhiri (IAsyncResult asyncResult, tag Objek) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest (hasil IAsyncResult)
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (langkah IExecutionStep, Boolean & completeSynchronously) +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>
      <%} %>

pengguna650922
sumber
2
Anda perlu menambahkan lebih banyak konteks untuk ini. Tunjukkan kepada kami kode pengontrol dan jelaskan tindakan tepat yang Anda lakukan. Lakukan sedikit debugging sendiri sehingga pertanyaan Anda lebih bertele-tele dan bukan hanya kumpulan kode / tumpukan besar.
Chev
Saya memeriksa JSON saya, saya memposting sangat dekat dan menemukan properti duplikat - satu dieja CustomerID dan satu dieja CustomerId - melalui kesalahan ketik javascript, kedua properti telah ditambahkan ke JSON yang saya posting, jadi hanya peringatan yang memecahkan masalah ini untuk saya.
AVH

Jawaban:

230

Kemungkinan besar , Anda memiliki model yang berisi properti yang sama dua kali . Mungkin Anda menggunakan newuntuk menyembunyikan properti dasar.

Solusinya adalah menimpa properti atau menggunakan nama lain.

Jika Anda membagikan model Anda, kami dapat menjelaskan lebih lanjut.

Aliostad
sumber
16
Dalam C #, katakanlah, jika Anda memiliki variabel1 dan Variabel1 (itu akan membuang kesalahan). Selain itu, periksa untuk memastikan tidak ada nama edmx yang serupa (kolom tabel berisi "CURRENCY", salah satu nama Properti Navigasi memiliki "Currency")
Robert Koch
7
@Naveen Hebat itu sudah diperbaiki! Saya melihat bagaimana ini bisa mengkompilasi tetapi membuang kesalahan di sini. Beberapa bagian kerangka kerja (tidak seperti C #) tidak peka huruf besar / kecil.
Aliostad
9
Akankah seseorang tahu bagaimana mengidentifikasi "kunci yang sama"?
ClayKaboom
1
Saya mulai mendapatkan ini setelah saya mengutak-atik beberapa model tampilan (menambahkan properti Id). Kesalahannya adalah bahwa JS sudah meletakkan "id" (id huruf kecil) ke objek untuk beberapa manajemen UI, tetapi saat mengirimkan, objek JSON memiliki properti "Id" dan "id", yang memetakan ke kunci yang sama di Pengikat model ASP.NET, maka kesalahan ini.
Svend
1
PS: ini diizinkan di MVC3, tetapi tidak di MVC5. Tidak yakin mengapa ini diubah.
Julian
20

Saya memiliki masalah yang sama dan inilah cara saya menyelesaikannya. Saya memiliki properti duplikat dengan nama yang sama di ViewModel saya. Satu Properti berada di BaseViewModel dan yang lainnya dalam Model turunan.

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


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

Saya mengubahnya menjadi

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


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

Sekarang sudah berfungsi dengan baik.

atulpatel.mca
sumber
Terima kasih, sekilas saja, ini juga terjadi meskipun basis dan model memiliki nama atribut yang sama dengan kasus yang berbeda misalnya Basis: Pengguna, Model: pengguna
Richard Housham
12

Saya memiliki masalah yang sama dan menemukan bahwa itu karena saya memiliki properti publik bernama serupa (yang seharusnya bersifat pribadi) yang hanya berbeda dalam kasus.

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

seharusnya

public string PropertyName {get;set;} 
private string propertyName {get;set;}
Hal
sumber
12

Saya memiliki 2 properti model seperti ini

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

aneh bahwa itu melemparkan kesalahan ini untuk 2 ini haha ​​..

CuriousBenjamin
sumber
6

Saya memiliki masalah bukan pada model C # saya, tetapi pada objek javascript yang saya posting menggunakan AJAX. Saya menggunakan Angular untuk mengikat dan memiliki Notesbidang kapital di halaman sementara objek C # saya mengharapkan huruf kecil notes. Kesalahan yang lebih deskriptif pasti menyenangkan.

C #:

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

Sudut / Javascript:

<input ng-model="post.Notes" type="text">
Jason Goemaat
sumber
2
Ini jawaban yang sedikit berbeda, tidak ada kelas C # saya yang memiliki properti duplikat dengan kasus berbeda, tetapi JSON yang dikirim ke pengontrol saya melakukannya. Saya pikir ini akan berguna bagi orang lain yang mencari masalah yang sama jika mereka tidak dapat menemukan masalah di kode C # mereka ..
Jason Goemaat
Sama seperti Goematt. Objek JSON yang sedang dikirim memiliki nama duplikat meskipun objek c # yang saya ikat benar-benar mengabaikan kunci tersebut, namun tetap gagal. Ini bodoh, bahkan mungkin serangga dalam pikiranku. Saya tidak mengontrol objek JSON yang sedang dikirim, jadi saya tidak dapat menjelaskan semua bidang tambahan yang sedang dikirim.
kukabuka
5

Saya memiliki masalah yang sama, saya foreachmengulang objek saya dan menambahkan hasilnya ke a Dictionary<string, string>dan saya memiliki `Duplikat di kunci dari database

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

        }

item.x memiliki nilai duplikat

Mina Gabriel
sumber
3

Saya menemukan jawabannya karena variabelnya. Seperti int a dan string a. ada dua variabel dengan nama yang sama.

pengguna650922
sumber
1

Inilah yang saya lakukan untuk menemukan kunci yang ditambahkan dua kali. Saya mengunduh kode sumber dari http://referencesource.microsoft.com/DotNetReferenceSource.zip dan menyiapkan VS ke sumber kerangka kerja debug. Membuka Dictionary.cs di VS menjalankan proyek, setelah halaman dimuat, menambahkan debug pada baris ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);dan dapat melihat nilai 'key'. Saya menyadari bahwa di JSON, satu huruf variabel menggunakan huruf besar, tetapi dalam model saya huruf kecil. Saya memperbaiki model dan sekarang kode yang sama berfungsi.

bvoleti.dll
sumber
1

Saya menekan ini di MVC 5 dan Visual Studio Express 2013. Saya memiliki dua properti dengan IndexAttributeseperti di bawah ini. Mengomentari salah satunya dan mengompilasi ulang menghasilkan scaffolding pengontrol MVC 5 dengan tampilan, menggunakan Entity Framework berhasil. Anehnya, ketika saya menghapus komentar atribut, mengkompilasi ulang, dan mencoba lagi, scaffolder berfungsi dengan baik.

Mungkin model data entitas yang mendasari atau "sesuatu" telah di-cache / rusak, dan menghapus dan menambahkan kembali IndexAttributehanya memicu pembangunan kembali "sesuatu" itu.

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

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

Di MVC 5 saya menemukan bahwa untuk sementara mengomentari referensi ke model Kerangka Entitas, dan mengompilasi ulang sisi proyek melangkahi kesalahan ini saat perancah. Setelah saya menyelesaikan perancah, saya menghapus komentar kodenya.

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

Saya ingin menambahkan jawaban yang tidak saya lihat di sini. Ini sangat terkait dengan jawaban yang diterima, namun, saya tidak memiliki properti duplikat pada model saya, itu adalah masalah dengan Javascript saya.

Saya melakukan beberapa penyimpanan Ajax di mana saya membangun kembali model untuk dikirim kembali ke server. Ketika saya pertama kali menginisialisasi halaman, saya menetapkan model asli saya ke variabel:

var currentModel = result.Data;

Saya result.Datamemiliki properti:result.Data.Items

Jadi, suatu saat nanti, saya melakukan beberapa hal dan ingin menabung, lewat Ajax. Bagian dari proses ini adalah mengambil array dari beberapa proses samping dan mengaturnya ke currentModel.Itemsproperti saya dan mengirimnya currentModelke server.

Dalam Javascript saya, bagaimanapun, saya melakukan ini, sebagai gantinya:

currentModel.items = getData();

Saya tidak menangkapnya, tetapi di Visual Studio, itu akan otomatis menurunkan huruf pertama untuk properti Javascript (itu bisa menjadi hal ReSharper juga). Kemudian, saya mendapat kesalahan persis yang diposting oleh OP ketika saya mencoba menyimpan karena currentModel sekarang memiliki currentModel.itemsDANcurrentModel.Items

Perubahan sederhana dari "item" menjadi "Item" memperbaiki masalah.

JasonWilczak
sumber
1

Masalah saya adalah saya memiliki @ Url.Action dan saya telah mengirimkan nilai untuk properti yang sama dua kali

abiNerd
sumber
1

Dalam kasus saya, hanya ketika Anda mengkompilasi kode, itu berjalan dengan baik. Tetapi memanggil salah satu bidang statis dari kelas statis yang memiliki kamus seperti yang dimiliki kode sampel, akan memunculkan pengecualian.

Kode sampel

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

Penjelasan ADict memiliki kunci "test" yang ditambahkan dua kali. Jadi, ketika Anda memanggil kelas statis, itu melempar pengecualian.

Ahmet Remzi EKMEKCI
sumber
0

Saya memiliki masalah yang sama. Tampak bagi saya setelah bermigrasi ke MVC 5 dari MVC 3.

Saya memiliki template editor khusus dan harus menggunakannya seperti ini sebelumnya:

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

Untuk mengatasi masalah saya harus menghapus ViewDataobjek yang lewat . Jadi pada akhirnya saya punya:

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

Semoga membantu.

Mariusz
sumber
0

Saya mengalami kesalahan yang sama. Dan setelah saya mengira pikiran saya rusak, karena saya telah mengganti nama hampir semua properti model saya, solusinya adalah menghapus satu referensi pada Semua Kontrol Syncfusion dan menambahkan referensi ke kontrol individu dari kontrol ini. (Dari Nuget)

AlfredBauer
sumber
0

Dalam kasus saya, akar masalahnya adalah nama properti duplikat di klien json yang hanya dibedakan berdasarkan sensitivitas huruf.

kubajs
sumber
0

Cara lain untuk menghadapi kesalahan ini adalah dari kumpulan data dengan kolom tanpa nama . Kesalahan muncul ketika kumpulan data diserialkan ke dalam JSON.

Pernyataan ini akan menghasilkan kesalahan:

select @column1, @column2

Menambahkan nama kolom akan mencegah kesalahan:

select @column1 as col1, @column2 as col2
pengguna9375338
sumber
0

Saya memiliki kesalahan yang sama tetapi b / c alasan yang berbeda. Menggunakan framework Entity. Satu hal lagi yang perlu saya tambahkan di sini sebelum saya membagikan kode dan solusi saya, saya mengalami titik putus pada metode pengontrol tetapi tidak melanggar di sana, hanya membuang pengecualian 500 kesalahan server internal.

Saya memposting data dari tampilan ke pengontrol melalui ajax (http post). Model yang saya harapkan sebagai parameter adalah sebuah kelas. Itu diwarisi dengan beberapa kelas lain.

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

dan terlihat

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

Cukup hapus bidang duplikat dari kelas PurchaseOrder dan itu bekerja seperti pesona.

Adeel Shekhani
sumber
0

Saya mengalami kesalahan yang sama. Ketika saya memeriksa kode tersebut maka saya menemukan bahwa menyatakan permintaan "GET" di sisi sudut (font-end) saya dan menyatakan permintaan "POST" di sisi ASP.net (back-end). Atur POST / GET salah satu di kedua sisi. Kemudian memecahkan kesalahan.

Sanjib Dhar
sumber
0

Saya menghadapi pengecualian serupa. Periksa apakah semua kolom memiliki nama header (dari kueri pemilihan dalam database) dengan nama properti yang sama persis di kelas model.

Vikas
sumber
0

Saya memiliki masalah ini di DBContext. Mendapat kesalahan saat saya mencoba menjalankan update-database di konsol Package Manager untuk menambahkan migrasi:

Status IDbSet virtual publik {get; set; }

Masalahnya adalah jenis dan namanya sama. Saya mengubahnya menjadi:

Status IDbSet virtual publik {get; set; }

LuTheZy
sumber