เพิ่มรายการที่มีคีย์เดียวกันแล้ว


140

ฉันได้รับข้อผิดพลาดนี้ทุกครั้งที่ฉันส่งแบบฟอร์ม แต่วิธีการดำเนินการไม่ได้ถูกเรียกเนื่องจากสิ่งนี้:

เพิ่มรายการที่มีคีย์เดียวกันแล้ว

และรายละเอียดข้อยกเว้น:

[ArgumentException: เพิ่มรายการที่มีคีย์เดียวกันแล้ว]
System.ThrowHelper.ThrowArgumentException (ทรัพยากร ExceptionResource) +52
System.Collections.Generic.Dictionary'2.Insert (คีย์ TKey, ค่า TValue, เพิ่มบูลีน) +9382923 ระบบ .Linq.Enumerable ToDictionary (ที่มา IEnumerable'1, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 Comparer) +252
System.Linq.Enumerable ToDictionary (IEnumerable'1 source, Func`2 keySelector, IEqualityComparer`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, Object model) +98
System.Web.Mvc.DefaultModelBinder.Bindextplex 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 ระบบ .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.MvcAsync. <> c__DisplayClass1.b__0 () +44 System.Web.MvcAsync <> c__DisplayClass8`1.b__7 (IAsyncResult _ ) +42 System.Web.MvcAsync.WrappedAsyncResult'1.End () +141 System.Web.Mvc Async AsyncResultWrapper.End (IAsyncResult asyncResult แท็กวัตถุ) +54
System.Web.MvcAsyncAsyncResultWrapper สิ้นสุด (IAsyncResult asyncResult, แท็กอ็อบเจ็กต์) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest (IAsync38Result ผลลัพธ์)
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (ขั้นตอน IExecutionStep บูลีนและเสร็จซิงโครนัส) +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
คุณต้องเพิ่มบริบทให้มากขึ้น แสดงรหัสคอนโทรลเลอร์และอธิบายการดำเนินการที่คุณกำลังดำเนินการ ทำการดีบักด้วยตัวเองเล็กน้อยเพื่อให้คำถามของคุณมีรายละเอียดมากขึ้นและไม่ใช่แค่โค้ด / สแต็กจำนวนมาก
Chev

ฉันตรวจสอบ JSON ของฉันฉันโพสต์อย่างใกล้ชิดมากและพบคุณสมบัติที่ซ้ำกัน - หนึ่งรหัสลูกค้าที่สะกดและหนึ่งสะกด CustomerId - ผ่านทางจาวาสคริปต์ที่พิมพ์ผิดคุณสมบัติทั้งสองได้ถูกเพิ่มลงใน JSON ที่ฉันโพสต์ดังนั้นโปรดทราบว่าเพื่อแก้ไขปัญหานี้สำหรับ ผม.
AVH

คำตอบ:


230

ส่วนใหญ่มีแนวโน้มที่คุณมีรูปแบบที่มีคุณสมบัติเดียวกันสองครั้ง บางทีคุณอาจใช้newเพื่อซ่อนคุณสมบัติพื้นฐาน

วิธีแก้ไขคือการลบล้างคุณสมบัติหรือใช้ชื่ออื่น

หากคุณแบ่งปันโมเดลของคุณเราจะสามารถอธิบายเพิ่มเติมได้


16
ใน C # พูดว่าถ้าคุณมี variable1 และ Variable1 (มันจะทำให้เกิดข้อผิดพลาด) ตรวจสอบให้แน่ใจว่าไม่มีชื่อ edmx ที่คล้ายกัน (คอลัมน์ตารางมี "CURRENCY" หนึ่งในชื่อคุณสมบัติการนำทางมี "สกุลเงิน")
Robert Koch

7
@Naveen Great มันได้รับการแก้ไขแล้ว! ฉันเห็นว่าวิธีนี้สามารถรวบรวมได้ แต่เกิดข้อผิดพลาดที่นี่ บางส่วนของกรอบ (ไม่เหมือน C #) ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
Aliostad

9
ใครจะรู้วิธีระบุว่า "คีย์เดียวกัน" คืออะไร
ClayKaboom

1
ฉันเริ่มได้รับสิ่งนี้หลังจากที่ฉันเล่นกับโมเดลมุมมองบางอย่าง (เพิ่มคุณสมบัติ Id) ข้อผิดพลาดคือ JS ได้ใส่ "id" (id ตัวพิมพ์เล็ก) ไว้บนออบเจ็กต์สำหรับการจัดการ UI บางอย่างแล้ว แต่เมื่อส่งอ็อบเจ็กต์ JSON มีคุณสมบัติ "Id" และ "id" ซึ่งแมปกับคีย์เดียวกันใน ตัวยึดแบบจำลองของ ASP.NET ดังนั้นข้อผิดพลาดนี้
Svend

1
PS: สิ่งนี้ได้รับอนุญาตใน MVC3 แต่ห้ามใน MVC5 ไม่แน่ใจว่าเหตุใดจึงมีการเปลี่ยนแปลง
Julian

20

ฉันมีปัญหาเดียวกันและนี่คือวิธีที่ฉันแก้ไข ฉันมีคุณสมบัติที่ซ้ำกันที่มีชื่อเดียวกันใน ViewModel ของฉัน คุณสมบัติหนึ่งอยู่ใน BaseViewModel และอีกคุณสมบัติหนึ่งอยู่ในโมเดลที่ได้รับ

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


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

ฉันเปลี่ยนเป็น

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


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

ตอนนี้ใช้งานได้ดี


ขอบคุณเพียงแค่ fyi สั้น ๆ สิ่งนี้ยังเกิดขึ้นแม้ว่าฐานและโมเดลจะมีชื่อแอตทริบิวต์เดียวกันกับกรณีที่แตกต่างกันเช่น Base: User, Model: user
Richard Housham

12

ฉันมีปัญหาที่คล้ายกันและพบว่าเป็นเพราะฉันมีทรัพย์สินสาธารณะที่มีชื่อคล้าย ๆ กัน (ซึ่งควรเป็นส่วนบุคคล) ซึ่งแตกต่างกันไปในแต่ละกรณีเท่านั้น

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

ควรจะเป็น

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

12

ฉันมีคุณสมบัติแบบจำลอง 2 แบบเช่นนี้

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

มันแปลกที่มันโยนข้อผิดพลาดให้ 2 ตัวนี้ฮ่า ๆ ..


6

ฉันมีปัญหาไม่ได้อยู่ในโมเดล C # ของฉัน แต่ในวัตถุจาวาสคริปต์ฉันกำลังโพสต์โดยใช้ AJAX ฉันใช้เชิงมุมสำหรับผลผูกพันและมีทุนNotesฟิลด์ในหน้าในขณะที่ C # notesวัตถุของฉันถูกคาดหวังว่ากรณีที่ต่ำกว่า ข้อผิดพลาดในการอธิบายเพิ่มเติมน่าจะดี

ค#:

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

เชิงมุม / Javascript:

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

2
เป็นคำตอบที่แตกต่างกันเล็กน้อยไม่มีคลาส C # ของฉันที่มีคุณสมบัติซ้ำกันในกรณีที่แตกต่างกัน แต่ JSON ที่ถูกส่งไปยังคอนโทรลเลอร์ของฉันทำ คิดว่าอาจมีประโยชน์กับคนอื่นที่ค้นหาปัญหาเดียวกันหากไม่พบปัญหาในรหัส C # ..
Jason Goemaat

เช่นเดียวกับ Goematt ออบเจ็กต์ JSON ที่ถูกส่งมีชื่อซ้ำกันแม้ว่าอ็อบเจ็กต์ c # ที่ฉันเชื่อมโยงจะเพิกเฉยต่อคีย์เหล่านั้นโดยสิ้นเชิง แต่ก็ยังล้มเหลว นี่มันโง่อาจจะเป็นจุดบกพร่องในใจ ฉันไม่ได้ควบคุมออบเจ็กต์ JSON ที่กำลังส่งดังนั้นฉันจึงไม่สามารถระบุสิ่งที่จะส่งฟิลด์พิเศษทั้งหมดได้
kukabuka

5

ฉันมีปัญหาเดียวกันฉันforeachวนลูปเหนือวัตถุของฉันและเพิ่มผลลัพธ์ลงใน a Dictionary<string, string>และฉันมี `` ซ้ำกันในคีย์จากฐานข้อมูล

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

        }

item.x มีค่าที่ซ้ำกัน



1

นี่คือสิ่งที่ฉันทำเพื่อค้นหาคีย์ที่ถูกเพิ่มสองครั้ง ฉันดาวน์โหลดซอร์สโค้ดจากhttp://referencesource.microsoft.com/DotNetReferenceSource.zipและตั้งค่า VS เพื่อแก้จุดบกพร่องของเฟรมเวิร์กซอร์ส เปิด Dictionary.cs ใน VS รันโปรเจ็กต์เมื่อโหลดเพจเพิ่มดีบักที่บรรทัดThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);และสามารถดูค่า 'คีย์' ได้ ฉันตระหนักว่าใน JSON หนึ่งตัวอักษรของตัวแปรเป็นตัวพิมพ์ใหญ่ แต่ในโมเดลของฉันเป็นตัวพิมพ์เล็ก ฉันแก้ไขโมเดลแล้วและตอนนี้รหัสเดียวกันใช้งานได้


1

ฉันตีสิ่งนี้ใน MVC 5 และ Visual Studio Express 2013 ฉันมีคุณสมบัติสองอย่างที่มีIndexAttributeลักษณะดังนี้ การแสดงความคิดเห็นหนึ่งในนั้นและการคอมไพล์ใหม่ส่งผลให้ตัวควบคุม MVC 5 นั่งร้านด้วยมุมมองการใช้ Entity Framework ประสบความสำเร็จ อย่างลึกลับเมื่อฉันไม่ใส่ส่วนประกอบของแอตทริบิวต์คอมไพล์ใหม่แล้วลองอีกครั้งโครงนั่งร้านก็ทำงานได้ดี

บางทีโมเดลข้อมูลเอนทิตีหรือ "บางสิ่ง" อาจถูกแคช / เสียหายและการลบและเพิ่มเข้าไปใหม่IndexAttributeทำให้เกิดการสร้าง "บางสิ่ง" ขึ้นมาใหม่

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

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

1

ใน MVC 5 ฉันพบว่าการแสดงความคิดเห็นชั่วคราวเกี่ยวกับการอ้างอิงไปยังโมเดล Entity Framework และการคอมไพล์ด้านโครงการใหม่ทำให้เกิดข้อผิดพลาดนี้เมื่อนั่งร้าน เมื่อนั่งร้านเสร็จแล้วฉันก็ยกเลิกการใส่รหัส

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

1

ขอเพิ่มคำตอบว่าไม่เห็นตรงนี้ มันเกี่ยวข้องมากกับคำตอบที่ยอมรับอย่างไรก็ตามฉันไม่มีคุณสมบัติที่ซ้ำกันในโมเดลของฉันมันเป็นปัญหากับ Javascript ของฉัน

ฉันกำลังทำการบันทึก Ajax ซึ่งฉันกำลังสร้างโมเดลใหม่เพื่อส่งกลับไปที่เซิร์ฟเวอร์ เมื่อฉันเริ่มต้นเพจครั้งแรกฉันตั้งค่าโมเดลดั้งเดิมของฉันเป็นตัวแปร:

var currentModel = result.Data;

ฉันresult.Dataมีทรัพย์สิน:result.Data.Items

หลังจากนั้นไม่นานฉันก็ทำบางอย่างและต้องการบันทึกผ่าน Ajax ส่วนหนึ่งของกระบวนการคือการดึงอาร์เรย์จากกระบวนการด้านข้างและตั้งค่าเป็นcurrentModel.Itemsคุณสมบัติของฉันและส่งcurrentModelไปยังเซิร์ฟเวอร์

อย่างไรก็ตามใน Javascript ของฉันฉันทำสิ่งนี้แทน:

currentModel.items = getData();

ฉันไม่ได้จับมัน แต่ใน Visual Studio มันจะพิมพ์ตัวอักษรตัวแรกให้เล็กลงโดยอัตโนมัติสำหรับคุณสมบัติ Javascript (อาจเป็นสิ่งที่ ReSharper ด้วยก็ได้) จากนั้นฉันได้รับข้อผิดพลาดที่แน่นอนที่โพสต์โดย OP เมื่อฉันพยายามบันทึกเนื่องจาก currentModel ตอนนี้มีcurrentModel.itemsANDcurrentModel.Items

การเปลี่ยนแปลงง่ายๆจาก "รายการ" เป็น "รายการ" ช่วยแก้ปัญหาได้


1

ปัญหาของฉันคือฉันมี @ Url.Action และฉันได้ส่งค่าสำหรับคุณสมบัติเดียวกันสองครั้ง


1

ในกรณีของฉันเมื่อคุณรวบรวมโค้ดมันก็ทำงานได้ดี แต่การเรียกหนึ่งในเขตข้อมูลแบบคงที่ของคลาสแบบคงที่ที่มีพจนานุกรมเหมือนโค้ดตัวอย่างมีข้อยกเว้น

โค้ดตัวอย่าง

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

คำอธิบาย ADict มีการเพิ่มคีย์ "test" สองครั้ง ดังนั้นเมื่อคุณเรียกคลาสคงที่มันจะแสดงข้อยกเว้น


0

ฉันมีปัญหาเดียวกัน ดูเหมือนว่าฉันหลังจากย้ายไป MVC 5 จาก MVC 3

ฉันมีเทมเพลตตัวแก้ไขที่กำหนดเองและต้องใช้แบบนี้มาก่อน:

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

เพื่อแก้ไขปัญหาฉันต้องลบViewDataวัตถุที่ผ่าน ในตอนท้ายฉันมี:

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

หวังว่าจะช่วยได้


0

ฉันมีข้อผิดพลาดเดียวกัน และหลังจากที่ฉันคิดว่าจิตใจของฉันเสียไปแล้วเพราะฉันได้เปลี่ยนชื่อคุณสมบัติโมเดลเกือบทั้งหมดของฉันแล้วโซลูชันนี้ก็ลบการอ้างอิงหนึ่งรายการใน All Syncfusion Controls และเพิ่มการอ้างอิงไปยังตัวควบคุมแต่ละตัวของคอนโทรลนี้ (จาก Nuget)


0

ในกรณีของฉันรากของปัญหาคือชื่อคุณสมบัติที่ซ้ำกันในไคลเอนต์ json ซึ่งแตกต่างกันตามความไวของตัวพิมพ์เท่านั้น


0

วิธีที่จะพบข้อผิดพลาดนี้ก็คือจากชุดข้อมูลที่มีคอลัมน์ที่ไม่มีชื่อ ข้อผิดพลาดเกิดขึ้นเมื่อชุดข้อมูลถูกทำให้เป็นอนุกรมเป็น JSON

คำสั่งนี้จะทำให้เกิดข้อผิดพลาด:

select @column1, @column2

การเพิ่มชื่อคอลัมน์จะป้องกันข้อผิดพลาด:

select @column1 as col1, @column2 as col2

0

ฉันมีข้อผิดพลาดเดียวกัน แต่ b / c ของเหตุผลที่แตกต่างกัน ใช้ Entity framework อีกสิ่งหนึ่งที่ฉันต้องเพิ่มที่นี่ก่อนที่ฉันจะแชร์รหัสและโซลูชันของฉันฉันมีจุดพักในวิธีการควบคุม แต่มันไม่ได้ทำลายที่นั่นเพียงแค่โยนข้อผิดพลาดเซิร์ฟเวอร์ภายใน 500 ข้อยกเว้น

ฉันกำลังโพสต์ข้อมูลจากมุมมองไปยังคอนโทรลเลอร์ผ่าน ajax (โพสต์ http) โมเดลที่ฉันคาดหวังว่าเป็นพารามิเตอร์คือคลาส มันถูกสืบทอดมากับคลาสอื่น ๆ

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

และในมุมมอง

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

เพียงแค่ลบฟิลด์ที่ซ้ำกันออกจากคลาส PurchaseOrder และมันก็ทำงานได้อย่างมีเสน่ห์


0

ฉันมีข้อผิดพลาดเดียวกัน เมื่อฉันตรวจสอบรหัสฉันพบว่ามีการประกาศคำขอ "GET" ในด้านเชิงมุม (ปลายอักษร) ของฉันและประกาศคำขอ "POST" ในด้าน ASP.net (ส่วนหลัง) ตั้งค่า POST / GET ในทั้งสองด้าน จากนั้นแก้ไขข้อผิดพลาด


0

ฉันเผชิญกับข้อยกเว้นที่คล้ายกัน ตรวจสอบว่าคอลัมน์ทั้งหมดมีชื่อส่วนหัว (จากคิวรีที่เลือกในฐานข้อมูล) ที่มีชื่อคุณสมบัติที่ตรงกันในคลาสโมเดลหรือไม่


0

ฉันมีปัญหานี้ใน DBContext ได้รับข้อผิดพลาดเมื่อฉันพยายามเรียกใช้ฐานข้อมูลอัพเดตในคอนโซล Package Manager เพื่อเพิ่มการย้ายข้อมูล:

สถานะ IDbSet เสมือนสาธารณะ {get; ชุด; }

ปัญหาคือประเภทและชื่อเหมือนกัน ฉันเปลี่ยนเป็น:

สถานะ IDbSet เสมือนสาธารณะ {get; ชุด; }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.