Một mục có cùng khóa đã được thêm vào


135

Tôi nhận được lỗi này bất cứ khi nào tôi gửi biểu mẫu cũng không được gọi phương thức hành động vì điều này:

Một mục có cùng khóa đã được thêm vào.

Và các chi tiết ngoại lệ:

[ArgumentException: Một mục có cùng khóa đã được thêm vào.]
System.ThrowHelper.ThrowArgumentException (Tài nguyên ExceptionResource) +52
System.Collections.Generic.Dixi`2.Insert (Khóa TKey, giá trị TValue, Boolean add) .Linq.Enumerable.ToDixi (nguồn IEnumerable`1, Func`2 keySelector, Func`2 ElementSelector, IEqualityComparer`1 so sánh) +252
System.Linq.Enumerable.ToDixi (IEnumerable so sánh) +91
System.Web.Mvc.ModelBindingContext.get_PropertyMetadata () +228 System.Web.Mvc.DefaultModelBinder.BindProperty (Trình điều khiểnContextContext, ModelBindingContext bindContext, propertyDescriptor
System.Web.Mvc.DefaultModelBinder.BindProperties (ControllerContext controllerContext, ModelBindingContext BindingContext) 147
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (ControllerContext controllerContext, ModelBindingContext BindingContext, mô hình Object) +98
System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext controlContext, ModelBindingContext bindContext) +2504
System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext điều khiểnContext , ModelBindingContext bindContext) +548
System.Web.Mvc.ContlerActionInvoker.GetParameterVal
System.Web.Mvc.Cont
đa .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.WrappingAsyncResult`1.End () +141 System.Web.Mvc.Async.AsyncResultRultult thẻ) +54
System.Web.Mvc.Async.AsyncResultWrapper.End (IAsyncResult asyncResult,Thẻ đối tượng) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHand.
System.Web.all .ExecuteStep (Bước IExecutStep, Boolean & hoàn thành không đồng bộ) +184

Xem trang

<%@ 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
Bạn cần thêm nhiều bối cảnh cho điều này. Chỉ cho chúng tôi mã điều khiển và mô tả chính xác các hành động bạn đang thực hiện. Tự mình sửa lỗi một chút để các câu hỏi của bạn dài dòng hơn và không chỉ là các khối mã / ngăn xếp khổng lồ.
Chev

Tôi đã kiểm tra JSON của mình. Tôi đã đăng rất chặt chẽ và tìm thấy một thuộc tính trùng lặp - một đánh vần là CustomerID và một đánh vần là CustomerId - thông qua một lỗi đánh máy javascript cả hai thuộc tính đã được thêm vào JSON mà tôi đang đăng, vì vậy chỉ cần một người đứng đầu đã giải quyết vấn đề này cho tôi.
AVH

Câu trả lời:


225

Nhiều khả năng , bạn có mô hình chứa cùng một thuộc tính hai lần . Có lẽ bạn đang sử dụng newđể ẩn tài sản cơ sở.

Giải pháp là ghi đè tài sản hoặc sử dụng tên khác.

Nếu bạn chia sẻ mô hình của bạn, chúng tôi sẽ có thể xây dựng nhiều hơn nữa.


16
Trong C #, giả sử, nếu bạn có biến1 và Biến1 (nó sẽ đưa ra lỗi). Ngoài ra, hãy kiểm tra để đảm bảo không có tên edmx tương tự (cột bảng có "TIỀN TỆ", một trong các tên Thuộc tính Điều hướng có "Tiền tệ")
Robert Koch

7
@Naveen Tuyệt vời nó đã được sửa! Tôi thấy rằng làm thế nào điều này có thể biên dịch nhưng ném lỗi ở đây. Một số phần của khung (không giống như C #) không phân biệt chữ hoa chữ thường.
Aliostad

9
Ai đó sẽ biết làm thế nào để xác định đó là "cùng một khóa?"
ClayKaboom

1
Tôi bắt đầu nhận được điều này sau khi tôi thay đổi một số mô hình xem (đã thêm một thuộc tính Id). Lỗi là do JS đã đặt "id" (id chữ thường) lên đối tượng cho một số quản lý UI, nhưng khi gửi, đối tượng JSON có cả hai thuộc tính "Id" và "id", ánh xạ tới cùng một khóa trong Chất kết dính mô hình của ASP.NET, do đó lỗi này.
Svend

1
PS: điều này được cho phép trong MVC3, nhưng không phải trong MVC5. Không chắc chắn tại sao điều này đã được thay đổi.
Julian

20

Tôi đã có cùng một vấn đề và đây là cách tôi giải quyết nó. Tôi đã có một thuộc tính trùng lặp có cùng tên trong ViewModel của mình. Một thuộc tính nằm trong BaseViewModel và một thuộc tính khác trong Mô hình dẫn xuất.

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


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

Tôi đã thay đổi nó thành

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


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

Bây giờ nó đang làm việc tốt.


Cảm ơn, chỉ là một fyi nhanh chóng, điều này cũng xảy ra ngay cả khi cơ sở và mô hình có cùng tên thuộc tính với các trường hợp khác nhau, ví dụ: Base: User, Model: user
Richard Housham

12

Tôi đã có một vấn đề tương tự và thấy rằng đó là vì tôi có một tài sản công cộng có tên tương tự (đáng lẽ là riêng tư) chỉ khác nhau trong trường hợp.

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

nên đã được

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

12

Tôi đã có 2 thuộc tính mô hình như thế này

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

Thật kỳ lạ khi nó đã ném lỗi này cho 2 haha ​​..


6

Tôi gặp vấn đề không phải ở mô hình C # của tôi, mà là trong đối tượng javascript tôi đã đăng bằng AJAX. Tôi đang sử dụng Angular để liên kết và có Notestrường viết hoa trên trang trong khi đối tượng C # của tôi đang mong đợi chữ thường notes. Một lỗi mô tả nhiều hơn chắc chắn sẽ tốt đẹp.

C #:

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

Góc / Javascript:

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

2
Đó là một câu trả lời hơi khác nhau, không có lớp C # nào của tôi có các thuộc tính trùng lặp với các trường hợp khác nhau, nhưng JSON được gửi đến bộ điều khiển của tôi đã làm. Nghĩ rằng nó có thể hữu ích với những người khác đang tìm kiếm cùng một vấn đề nếu họ không thể tìm thấy vấn đề trong mã C # của họ ..
Jason Goemaat

Tương tự như Goematt. Đối tượng JSON được gửi có tên trùng lặp mặc dù đối tượng c # mà tôi đã liên kết hoàn toàn bỏ qua các khóa đó, nhưng nó vẫn thất bại. Điều này thật ngu ngốc, thậm chí có thể là một lỗi trong tâm trí của tôi. Tôi không kiểm soát đối tượng JSON được gửi, vì vậy tôi không thể tính đến những gì tất cả các trường bổ sung đang được gửi.
kukabuka

5

Tôi có cùng một vấn đề, tôi đã foreachlặp lại đối tượng của mình và thêm kết quả vào a Dictionary<string, string>và tôi có một `trùng lặp trong khóa từ cơ sở dữ liệu

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

        }

item.x có một giá trị trùng lặp


3

Tôi tìm thấy câu trả lời. Đó là vì các biến. Giống như int a và chuỗi a. Có hai biến có cùng tên.


1

Đây là những gì tôi đã làm để tìm ra chìa khóa đã được thêm hai lần. Tôi đã tải xuống mã nguồn từ http://referencesource.microsoft.com/DotNetReferenceSource.zip và thiết lập VS để gỡ lỗi nguồn khung. Đã mở Dictionary.cs trong VS chạy dự án, sau khi tải trang, đã thêm gỡ lỗi tại dòng ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);và có thể thấy giá trị 'khóa'. Tôi nhận ra rằng trong JSON, một chữ cái của một biến là chữ in hoa nhưng trong mô hình của tôi, nó là chữ thường. Tôi đã sửa mô hình và bây giờ mã tương tự hoạt động.


1

Tôi đã nhấn vào điều này trong MVC 5 và Visual Studio Express 2013. Tôi có hai thuộc tính IndexAttributegiống như bên dưới. Nhận xét một trong số chúng và biên dịch lại dẫn đến việc dàn dựng bộ điều khiển MVC 5 với các khung nhìn, sử dụng Entity Framework thành công. Một cách bí ẩn, khi tôi bỏ ghi chú thuộc tính, biên dịch lại và thử lại, giàn giáo chạy tốt.

Có lẽ mô hình dữ liệu thực thể cơ bản hoặc "một cái gì đó" đã được lưu trữ / hỏng, và loại bỏ và thêm lại IndexAttributeđơn giản đã kích hoạt một bản dựng lại của "cái gì đó".

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

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

1

Trong MVC 5 tôi thấy rằng tạm thời nhận xét các tham chiếu đến mô hình Entity Framework và biên dịch lại phía dự án đã khắc phục lỗi này khi giàn giáo. Khi tôi hoàn thành giàn giáo, tôi bỏ mã.

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

1

Tôi muốn thêm một câu trả lời mà tôi không thấy ở đây. Nó rất liên quan đến câu trả lời được chấp nhận, tuy nhiên, tôi không có các thuộc tính trùng lặp trên mô hình của mình, đó là một vấn đề với Javascript của tôi.

Tôi đã thực hiện một số lưu Ajax nơi tôi đang xây dựng lại mô hình để gửi lại cho máy chủ. Khi tôi lần đầu tiên khởi tạo trang, tôi đặt mô hình ban đầu của mình thành một biến:

var currentModel = result.Data;

Của tôi result.Data có một tài sản:result.Data.Items

Vì vậy, một thời gian sau, tôi làm một số điều và muốn lưu lại, thông qua Ajax. Một phần của quy trình là lấy một mảng từ một số quy trình phụ và đặt nó vào currentModel.Itemstài sản của tôi và gửicurrentModel đến máy chủ.

Tuy nhiên, trong Javascript của tôi, tôi đã làm điều này, thay vào đó:

currentModel.items = getData();

Tôi đã không bắt được nó, nhưng trong Visual Studio, nó sẽ tự động viết thường chữ cái đầu tiên cho các thuộc tính Javascript (nó cũng có thể là một thứ ReSharper). Sau đó, tôi đã nhận được lỗi chính xác được đăng bởi OP khi tôi cố lưu vì currentModel hiện có currentModel.itemsANDcurrentModel.Items

Một thay đổi đơn giản từ "mục" thành "Mục" đã khắc phục sự cố.


1

Vấn đề của tôi là tôi đã có @ Url.Action và tôi đã gửi qua một giá trị cho cùng một tài sản hai lần


1

Trong trường hợp của tôi, chỉ cần khi bạn biên dịch mã, nó sẽ chạy tốt. Nhưng việc gọi một trong các trường tĩnh của một lớp tĩnh có từ điển như mã mẫu có, sẽ ném ngoại lệ.

Mã mẫu

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

Giải thích ADict có khóa "test" được thêm hai lần. Vì vậy, khi bạn gọi lớp tĩnh, nó sẽ ném ngoại lệ.


0

Tôi đã có vấn đề tương tự. Nó xuất hiện với tôi sau khi chuyển sang MVC 5 từ MVC 3.

Tôi đã có mẫu trình soạn thảo tùy chỉnh và phải sử dụng nó như thế này trước đây:

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

Để giải quyết vấn đề tôi đã phải loại bỏ ViewDatađối tượng đi qua . Vì vậy, cuối cùng tôi đã có:

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

Hy vọng nó giúp.


0

Tôi đã có cùng một lỗi. Và sau khi tôi nghĩ rằng đầu óc mình đã bị phá vỡ, vì tôi đã đổi tên gần như tất cả các thuộc tính mô hình của mình, giải pháp đã xóa một tham chiếu trên All Syncfusion Controls và thêm các tham chiếu đến các điều khiển riêng lẻ của các điều khiển này. (Từ Nuget)


0

Trong trường hợp của tôi, gốc của vấn đề là tên thuộc tính trùng lặp trong ứng dụng khách json, chỉ khác nhau bởi độ nhạy trường hợp.


0

Một cách khác để gặp lỗi này là từ một tập dữ liệu với các cột không tên . Lỗi được đưa ra khi tập dữ liệu được tuần tự hóa thành JSON.

Tuyên bố này sẽ dẫn đến lỗi:

select @column1, @column2

Thêm tên cột sẽ ngăn lỗi:

select @column1 as col1, @column2 as col2

0

Tôi đã có cùng một lỗi nhưng b / c của lý do khác. Sử dụng khung thực thể. Một điều nữa tôi cần thêm vào đây trước khi tôi chia sẻ mã và giải pháp của mình, tôi đã có một điểm dừng trên phương thức điều khiển nhưng nó không bị phá vỡ ở đó, chỉ ném ngoại lệ 500 lỗi máy chủ nội bộ.

Tôi đã đăng dữ liệu từ chế độ xem đến bộ điều khiển thông qua ajax (http post). Mô hình mà tôi mong đợi như một tham số là một lớp. Nó được kế thừa với một số lớp khác.

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

và trong tầm nhìn

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

Đơn giản chỉ cần loại bỏ các trường trùng lặp khỏi lớp Purchasingder và nó hoạt động như một nét duyên dáng.


0

Tôi đã có cùng một lỗi. Khi tôi kiểm tra mã thì tôi thấy rằng khai báo yêu cầu "NHẬN" ở phía góc (phông chữ) của tôi và khai báo yêu cầu "POST" ở phía ASP.net (back-end). Đặt POST / GET bất kỳ một trong cả hai bên. Sau đó đã giải quyết được lỗi.


0

Tôi phải đối mặt với ngoại lệ tương tự. Kiểm tra xem tất cả các cột có tên tiêu đề (từ truy vấn chọn trong cơ sở dữ liệu) với tên thuộc tính khớp chính xác trong lớp mô hình.


0

Tôi đã có vấn đề này trên DBContext. Đã xảy ra lỗi khi tôi thử chạy cơ sở dữ liệu cập nhật trong bảng điều khiển Trình quản lý gói để thêm di chuyển:

Trạng thái IDbset ảo công khai {get; bộ; }

Vấn đề là loại và tên giống nhau. Tôi đã đổi nó thành:

Trạng thái IDbset ảo công khai {get; bộ; }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.