2014-11-26 6 views
8

Ich habe in SQL Server eine Ansicht erstellt, die die wichtigsten Spalten aus verschiedenen Tabellen enthält. Drucken des Inhalts der Tabelle in der Asp.net-MVC-Ansicht funktioniert einwandfrei, aber wenn ich die Details eines einzelnen Datensatzes abrufen möchte, tritt das Problem auf.Die Anzahl der übergebenen Primärschlüsselwerte muss mit der Anzahl der für die Entität definierten Primärschlüsselwerte übereinstimmen.

Die Anzahl der übergebenen Primärschlüsselwerte muss der Anzahl der auf der Entität definierten Primärschlüsselwerte entsprechen.

ich navigieren Sie zu dem bestimmten Datensatz dies zu tun:

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

Rekordzahl der Primärschlüssel ist. Ich setze das manuell, indem ich mit der rechten Maustaste auf die spezifische Variable im Modell .edmx klicke. Dann versuche ich, die spezifischen Daten zu erhalten, mit dem folgenden:

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

Und das Modell wie folgt aussehen:

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

Im Moment habe ich den folgenden Code verwende es alle Arbeit zu machen. Aber ich denke nicht, dass dies ein sehr guter Weg oder effizient ist. Und ich bin sehr gespannt, wie ich den Fehler oben beheben kann!

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

Jemand hat eine Idee, warum dieser Fehler auftritt? Danke für die Hilfe!

Antwort

18

Wenn Sie Ihren Primärschlüssel in .edmx setzen, sollten Sie auch Ihre Datenbank aktualisieren, da Sie PK in Ihrem Modell und nicht in Ihrer Datenbank haben. Update: funktioniert nicht für Ansichten.

Für Ansichten verwenden Sie .SingleOrDefault anstelle von Find().

In diesem Szenario ändern Sie die folgende Zeile ein: RecordDataView record = db.RecordDataView.Find(id); auf die folgenden: RecordDataView recorddataview = db.RecordDataView.SingleOrDefault(m => m.Record_number == id);

+1

Ist es möglich, einen Primärschlüssel zu einer Ansicht in der Datenbank hinzuzufügen? –

+2

Entschuldigung, ich dachte, dass Sie gesagt haben, dass Sie PK zu normalen Tabelle in EDMX-Datei hinzugefügt, um nicht anzuzeigen. Hast du versucht .SingleOrDefault statt Find()? – Marcin

+1

Arbeitete wie ein Charme! Vielen Dank! Ich habe dann folgende Zeile geändert: 'RecordDataView record = db.RecordDataView.Find (id); // Fehler wird hier OCCUR' auf die folgenden: 'RecordDataView recorddataview = db.RecordDataView.SingleOrDefault (m => m.Record_number == id);' Nochmals vielen Dank! –

0

Wenn Ihre Datenbanktabelle Ihr edmx Modell jedes Feld wird davon ausgegangen ist kein Primärschlüsselfeld angeben, wird ein Schlüssel. Stellen Sie also sicher, dass Ihre Datenbank und Ihr Entitätsmodell dasselbe sagen.

Wenn Ihr Modell und Ihre Datenbank den Primärschlüssel korrekt angeben, können Sie .Find() verwenden und es wird funktionieren.

Verwandte Themen