Dot-Net

傳遞的主鍵值的數量必須與實體上定義的主鍵值的數量相匹配

  • August 22, 2016

我在 SQL Server 中創建了一個視圖,其中包含來自不同表的最重要的列。將表的內容列印到 ASP.NET MVC 視圖可以正常工作,但是當我想獲取單個記錄的詳細資訊時,就會出現問題。

傳遞的主鍵值的數量必須與實體上定義的主鍵值的數量相匹配。

我導航到執行此操作的特定記錄:

@Html.ActionLink("Details", "Details", new {  id=item.Record_number  })

記錄號是主鍵。我通過右鍵點擊.edmx模型中的特定變數來手動設置它。然後我嘗試使用以下方法獲取特定數據:

   //
   // GET: /Record/Details/5
   public ActionResult Details(int id = 0)
   {
       try
       {
           RecordDataView record = db.RecordDataView.Find(id); //HERE THE ERROR OCCUR
           if (record == null)
           {
               return HttpNotFound();
           }
           return View(record);
       }
       catch(EntityException)
       {
           return RedirectToAction("NoDatabaseConnection", "Home");
       }
   }

模型如下所示:

namespace Implant.Database
{
   using System;
   using System.Collections.Generic;

   public partial class RecordDataView
   {
       public int Record_number { get; set; }
       public Nullable<System.DateTime> DOB { get; set; }
       public Nullable<System.DateTime> Record_date { get; set; }

       /** rest of code omitted */ 
   }
}

目前,我正在使用以下程式碼使其全部正常工作。但我不覺得這是一個很好的方式或效率。我很好奇如何解決上面的故障!

   //
   // GET: /Record/Details/5
   public ActionResult Details(int id = 0)
   {
       var record = from r in db.RecordDataView
                    select r;
       if (id != 0)
       {
           record = record.Where(r => r.Record_number == id);
       }
       RecordDataView rec = record.ToList().First(); 

       return View(rec);   
   }

有人知道為什麼會發生此錯誤嗎?感謝幫助!

如果你設置了主鍵,.edmx你也應該更新你的數據庫,因為你的模型中有 PK 而不是你的數據庫中。 更新:不適用於視圖。

對於視圖使用.SingleOrDefault而不是Find().

在這種情況下,更改以下行:RecordDataView record = db.RecordDataView.Find(id); 到以下內容:RecordDataView recorddataview = db.RecordDataView.SingleOrDefault(m => m.Record_number == id);

如果您的數據庫表未指定主鍵欄位,您的 edmx 模型將假定每個欄位都是一個鍵。所以確保你的數據庫和你的實體模型說同樣的話。

如果您的模型和數據庫正確指定了主鍵,那麼您可以使用 .Find() 並且它會起作用。

引用自:https://stackoverflow.com/questions/27150575