Dot-Net
傳遞的主鍵值的數量必須與實體上定義的主鍵值的數量相匹配
我在 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() 並且它會起作用。