Aynı anahtara sahip bir öğe zaten eklenmiş


135

Formu gönderdiğinizde, bu nedenle eylem yöntemi çağrılmadığında bu hatayı alıyorum:

Aynı anahtara sahip bir öğe zaten eklenmiş.

Ve istisna ayrıntıları:

[ArgumentException: Aynı anahtara sahip bir öğe zaten eklenmiş.]
System.ThrowHelper.ThrowArgumentException (ExceptionResource
source ) +52 System.Collections.Generic.Dictionary`2.Insert (TKey anahtarı, TValue değeri, Boolean add) +9382923 Sistem .Linq.Enumerable.ToDictionary (IEnumerable`1 kaynak, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 karşılaştırıcı) +252
System.Linq.Enumerable.ToDictionary (IEnumerable`1 kaynak, Func`2 keySelector, IEqualityComparer`1 karşılaştırıcı) +91
System.Web.Mvc.ModelBindingContext.get_PropertyMetadata () +228 System.Web.Mvc.DefaultModelBinder.BindProperty (ControllerContext controllerContext, ModelBindingContext bağlamaContext, PropertyDescriptor propertyDescriptor) +392
System.Web.Mvc.DefaultModelBinder.BindProperties (ControllerContext controllerContext, ModelBindingContext bağlamaContext) +147
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (ControllerContext controllerContext, ModelBindingContext bağlamaContext, Nesne modeli) +98
System.Web.ModelMod.Dod.Bod.Mod.Da.OrtaMod.Dadak.Mod.Da.OrtaMod.Dadak.com controllerContext, ModelBindingContext bağlamaContext) +2504
System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bağlamaContext) +548
System.Web.Mvc.ControllerActionInvoker.GetParameterValue (ControllerContext controllerContext) Bağlam, ParameterDestor3 parametresi
System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +830 System.Web.Mvc.Controller.Execute (xecute)) .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, Nesne etiketi) +54
System.Web.Mvc.Async.AsyncResultWrapper. End (IAsyncResult asyncResult, Object etiketi) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHvcler.System.Web.IHttpAsyncHandler.EndProcessRequest ( IAsyncResult sonucu)
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (IExecutionStep adımı, Boolean ve tamamlandıSenkronize) +184

Sayfaya bak

<%@ 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
Buna daha fazla bağlam eklemeniz gerekiyor. Bize denetleyici kodunu gösterin ve tam olarak yaptığınız işlemleri açıklayın. Kendi başınıza küçük bir hata ayıklama yapın, böylece sorularınız sadece kod / yığın dev yığınları değil, daha ayrıntılıdır.
Chev

JSON'umu çok yakından gönderiyordum ve yinelenen bir özellik buldum - biri yazıldığını CustomerID ve biri yazıldığını CustomerId - javascript yazım hatasıyla her iki özellik de paylaştığım JSON'a eklenmişti, bu yüzden sadece bu konuyu çözdüm ben mi.
AVH

Yanıtlar:


225

Büyük olasılıkla , aynı özelliği iki kez içeren bir modeliniz var . Belki de newbase özelliğini gizlemek için kullanıyorsunuzdur .

Çözüm özelliği geçersiz kılmak veya başka bir ad kullanmaktır.

Modelinizi paylaşırsanız, daha fazla ayrıntı verebiliriz.


16
C # 'da, diyelim, değişken1 ve Değişken1 varsa (hatayı atar). Ayrıca, benzer edmx adlarının olmadığından emin olun (tablo sütununda "CURRENCY", Gezinme Özellikleri adlarından birinde "Para Birimi" vardı)
Robert Koch

7
@Naveen Harika düzeltildi! Bunun nasıl derlenebileceğini görüyorum ama buraya hata atıyorum. Çerçevenin bazı bölümleri (C # 'dan farklı olarak) büyük / küçük harfe duyarlı değildir.
Aliostad

9
Birisi hangisinin "aynı anahtar" olduğunu nasıl belirleyebilir?
ClayKaboom

1
Bazı görünüm modelleri ile uğraştıktan sonra bunu almaya başladım (bir Id özelliği ekledi). Hata, JS'nin bazı UI yönetimi için nesneye zaten bir "id" (küçük harf id) koymasıydı, ancak gönderirken, JSON nesnesinin aynı anahtarla eşlenen hem "Id" hem de "id" özelliklerine sahip olmasıydı. ASP.NET model bağlayıcı, bu nedenle bu hata.
Svend

1
Not: buna MVC3'te izin verilir, ancak MVC5'te izin verilmez. Bunun neden değiştirildiğinden emin değilim.
Julian

20

Aynı sorunu yaşadım ve bu şekilde çözdüm. ViewModel'imde aynı ada sahip yinelenen bir özellik vardı. Bir Özellik BaseViewModel'de, diğeri türetilmiş Modelde.

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


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

Bunu ben olarak değiştirdim

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


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

Şimdi iyi çalışıyor.


Kullanıcı: Model Kullanıcı: sayesinde, sadece hızlı bilginize, bu da taban ve model farklı vaka örn Base ile aynı özellik adını olsa bile oluşur
Richard Housham

12

Ben benzer bir sorun vardı ve ben sadece durumda farklı benzer bir adlı (özel olması gerekirdi) kamu mülkiyet vardı çünkü bulundu.

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

olması gerekirdi

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

12

Bunun gibi 2 model özelliğim vardı

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

bu hatayı bu 2 haha ​​için atması garip ..


6

Benim C # modelinde sorun vardı, ama javascript nesnesinde AJAX kullanarak gönderme. Bağlama için Açısal kullanıyorum ve Notesbenim C # nesnesi küçük harf beklerken sayfada büyük harfle yazılmış bir alan vardı notes. Daha açıklayıcı bir hata kesinlikle iyi olurdu.

C #:

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

Eğik / JavaScript:

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

2
Bu biraz farklı bir yanıt, C # sınıflarımdan hiçbirinin farklı durumlar ile yinelenen özellikleri yok, ancak denetleyicime gönderilen JSON bunu yaptı. Sorunu C # kodunda bulamazlarsa aynı sorunu arayan diğer kişilerle kullanışlı olabileceğini düşündüm.
Jason Goemaat

Goematt ile aynı. Bağlandığım c # nesnesi bu anahtarları tamamen yok saysa da, gönderilen JSON nesnesinin yinelenen adları vardı, yine de başarısız oldu. Bu aptalca, belki de aklımdaki bir böcek. Gönderilen JSON nesnesini kontrol etmiyorum, bu yüzden tüm ekstra alanların ne gönderileceğini açıklayamıyorum.
kukabuka

5

Ben de aynı sorunu vardı, ben foreachbenim nesnenin üzerinde döngü ve sonucu ekleyerek bir Dictionary<string, string>ve ben veritabanından anahtar `` Çoğalt

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

        }

item.x yinelenen bir değere sahipti


3

Cevabı buldum.Çünkü değişkenler yüzünden. İnt a ve string a gibi. aynı ada sahip iki değişken vardı.


1

İşte iki kez eklenen anahtarı bulmak için ne yaptım. Kaynak kodunu http://referencesource.microsoft.com/DotNetReferenceSource.zip adresinden indirdim ve VS'yi çerçeve kaynağında hata ayıklamak için ayarladım. VS'de Dictionary.cs açıldı, proje yüklendikten sonra satırda bir hata ayıklama ekledi ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);ve 'anahtar' değerini görebildi. JSON'da bir değişkenin bir harfinin büyük harf olduğunu, ancak modelimde küçük harf olduğunu fark ettim. Modeli düzelttim ve şimdi aynı kod çalışıyor.


1

Bunu MVC 5 ve Visual Studio Express 2013'te kullandım. IndexAttribute . Aşağıdaki gibi . Bunlardan birini yorumlamak ve yeniden derlemek, MVC 5 denetleyicisinin görünümleri olan iskele ile sonuçlandı ve Entity Framework başarılı oldu. Gizemli bir şekilde, özelliği kaldırdığımda, yeniden derlediğimde ve tekrar denediğimde, iskele gayet iyi çalıştı.

Belki de temeldeki varlık veri modeli veya "bir şey" önbelleğe alındı ​​/ bozuldu ve IndexAttributebasitçe tetiklenen ve bu "bir şey" in yeniden oluşturulmasını yeniden ekleme .

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

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

1

MVC 5'te geçici olarak bir Entity Framework modeline yapılan referansları yorumladığını ve proje tarafının yeniden derlenmesinin iskele sırasında bu hatayı bastığını buldum. Ben iskele bittikten sonra kodu uncomment.

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

1

Burada görmediğim bir cevap eklemek istiyorum. Kabul edilen cevapla çok ilgili, ancak modelimde yinelenen özellikler yoktu, Javascript'imle ilgili bir sorun vardı.

Sunucuya geri göndermek için modeli yeniden oluşturduğum bazı Ajax kaydetme yapıyordum. Sayfayı ilk başlattığımda orijinal modelimi bir değişkene ayarladım:

var currentModel = result.Data;

Benim result.Databir özelliği var:result.Data.Items

Bir süre sonra, Ajax aracılığıyla bazı şeyler yaparım ve kaydetmek istiyorum. Sürecin bir kısmı, bazı yan işlemlerden bir dizi alıp benim currentModel.Itemsmülküme ayarlayıp currentModelsunucuya göndermektir .

Benim Javascript, ancak, ben bunun yerine yaptım:

currentModel.items = getData();

Onu yakalamadım, ancak Visual Studio'da, Javascript özellikleri için ilk harfi otomatik olarak küçültür (ReSharper bir şey de olabilir). Daha sonra, currentModel artık currentModel.itemsAND olduğundan kaydetmeye çalıştığımda OP tarafından gönderilen kesin hatayı aldımcurrentModel.Items

"Öğeler" den "Öğeler" e basit bir değişiklik sorunu çözdü.


1

Benim sorunum bir @ Url.Action vardı ve aynı özellik için bir değer yoluyla iki kez göndermiş oldu


1

Benim durumumda, sadece kodu derlediğinizde, iyi çalışıyor. Ancak, örnek kod gibi bir sözlüğe sahip statik bir sınıfın statik alanlarından birini çağırmak istisnayı atar.

Basit kod

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

Açıklama ADict'e iki kez "test" anahtarı eklendi. Yani, statik sınıfı çağırdığınızda, istisna atar.


0

Ben de aynı sorunu yaşadım. MVC 3'ten MVC 5'e geçtikten sonra bana öyle geldi.

Özel editör şablonu vardı ve daha önce böyle kullanmak zorunda kaldı:

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

Sorunu çözmek için geçen ViewDatanesneyi kaldırmak zorunda kaldım . Sonunda:

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

Umarım yardımcı olur.


0

Aynı hatayla karşılaştım. Zaten zihnimin kırıldığını düşündükten sonra, neredeyse tüm model özelliklerimi yeniden adlandırdığım için çözüm, Tüm Senkfüzyon Kontrolleri üzerindeki bir referansı silmek ve bu kontrollerin bağımsız kontrollerine referanslar eklemekti. (Nuget'ten)


0

Benim durumumda sorunun kökü sadece büyük / küçük harf duyarlılığı ile farklılık gösteren istemci json yinelenen özellik adı oldu.


0

Bu hatayla karşılaşmanın başka bir yolu , adlandırılmamış sütunlara sahip bir veri kümesinden . Veri kümesi JSON'a serileştirildiğinde hata atılır.

Bu ifade hatayla sonuçlanır:

select @column1, @column2

Sütun adlarının eklenmesi hatayı önler:

select @column1 as col1, @column2 as col2

0

Ben aynı hata var ama fark b / c. Varlık çerçevesini kullanma. Kodumu ve çözümümü paylaşmadan önce buraya eklemem gereken bir şey daha var, denetleyici yönteminde bir kırılma noktası vardı, ancak orada kırılmıyordu, sadece istisna 500 dahili sunucu hatası atıyor.

Ajax (http post) aracılığıyla görünümden denetleyiciye veri gönderiyordum. Parametre olarak beklediğim model bir sınıftı. Başka bir sınıfla miras alındı.

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

ve görüşte

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

Basitçe çoğaltılmış alanları PurchaseOrder sınıfından kaldırıldı ve bir cazibe gibi çalıştı.


0

Aynı hatayla karşılaştım. Ben kodu kontrol sonra benim açısal (font-end) tarafında "GET" isteği beyan ve ASP.net (arka uç) tarafında "POST" isteği ilan bulundu. Her iki tarafta da POST / GET ayarını yapın. Sonra hatayı çözdü.


0

Benzer bir istisna ile karşılaştım. Tüm sütunların, model sınıfında tam olarak eşleşen özellik adlarına sahip başlık adlarının (veritabanındaki belirli sorgudan) olup olmadığını kontrol edin.


0

DBContext üzerinde bu sorunu vardı. Taşıma eklemek için Paket Yöneticisi konsolunda bir güncelleme veritabanı çalıştırmayı denediğimde hata aldım:

herkese açık sanal IDbSet Durumu {get; Ayarlamak; }

Sorun, tür ve adın aynı olmasıydı. Bunu şöyle değiştirdim:

herkese açık sanal IDbSet Durumları {get; Ayarlamak; }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.