2014-11-26 14 views
8

Tôi đã tạo chế độ xem trong SQL Server có chứa các cột quan trọng nhất từ ​​các bảng khác nhau. In nội dung của bảng vào khung nhìn ASP.NET MVC hoạt động tốt, nhưng khi tôi muốn lấy chi tiết của một bản ghi duy nhất, sự cố xảy ra.Số lượng giá trị khóa chính được truyền phải khớp với số giá trị khóa chính được xác định trên thực thể

Số lượng giá trị khóa chính phải khớp với số giá trị khóa chính được xác định trên thực thể.

tôi hướng đến kỷ lục cụ thể làm điều này:

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

Ghi số là khóa chính. Tôi đặt điều này theo cách thủ công bằng cách nhấp chuột phải vào biến cụ thể trong mô hình .edmx. Sau đó, tôi cố gắng để có được những dữ liệu cụ thể bằng cách sử dụng sau đây:

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

Và mô hình trông như thế này:

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 */ 
    } 
} 

Hiện nay tôi đang sử dụng đoạn mã sau để làm cho nó tất cả công việc. Nhưng tôi không cảm thấy đây là một cách hay hay hiệu quả. Và tôi rất tò mò làm thế nào để sửa lỗi thất bại ở trên!

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

người có bất kỳ ý tưởng tại sao lỗi này xảy ra? Cảm ơn vì sự giúp đỡ!

Trả lời

18

Nếu bạn đặt khóa chính trong .edmx, bạn cũng nên cập nhật cơ sở dữ liệu của mình, vì bạn có PK trong mô hình của mình và không có trong cơ sở dữ liệu. Cập nhật: không hoạt động cho các chế độ xem.

Đối với chế độ xem sử dụng .SingleOrDefault thay vì Find().

Trong kịch bản này thay đổi dòng sau: RecordDataView record = db.RecordDataView.Find(id); Để điều sau đây: RecordDataView recorddataview = db.RecordDataView.SingleOrDefault(m => m.Record_number == id);

+1

Có thể thêm khóa chính vào chế độ xem trong cơ sở dữ liệu không? –

+2

Xin lỗi tôi nghĩ rằng bạn đã nói rằng bạn đã thêm PK vào bảng bình thường trong tệp edmx không xem. Bạn đã thử .SingleOrDefault thay vì Find()? – Marcin

+1

Làm việc như một sự quyến rũ! Cảm ơn nhiều! Sau đó tôi đã thay đổi dòng sau: 'RecordDataView record = db.RecordDataView.Find (id); // ĐÂY CÁC LỖI OCCUR' Để sau: 'RecordDataView recorddataview = db.RecordDataView.SingleOrDefault (m => m.Record_number == id); ' Một lần nữa, cảm ơn bạn! –

0

Nếu bảng cơ sở dữ liệu của bạn không chỉ định một trường tiểu học trọng, mô hình edmx của bạn sẽ cho rằng mỗi lĩnh vực là chìa khóa. Vì vậy, hãy đảm bảo cơ sở dữ liệu của bạn và mô hình tổ chức của bạn nói điều tương tự.

Nếu mô hình và cơ sở dữ liệu của bạn chỉ định chính xác khóa chính, thì bạn có thể sử dụng .Find() và nó sẽ hoạt động.

Các vấn đề liên quan