2016-10-24 3 views
1

Dies ist ein bisschen peinlich, wie ich bin sicher, die Antwort ist einfach.ASP.NET MVC Liste Verkettung Elterntabelle Feld

Ich benutze Entityframework und Code First-Techniken versuchen, meine erste funktionale MVC-Form zu bauen, während die ausgezeichneten ASP.NET-Tutorials folgen.

Wie zeige ich eine Zeichenfolge an, die übergeordnete Informationen zu der Tabelle enthält, die abgefragt wird. Ich wollte einen Elternwert in die Zeichenfolge aufnehmen, die für die Dropdown-Liste verwendet wird. Oder sollte ich das Gegenteil tun und die Eltern auswählen und die Kinder als Ergebnis der Auswahl erscheinen lassen?

Ich dachte, es wäre so einfach wie das Hinzufügen zum Modell, da es bereits mit seinem Elternteil spricht. Intellisense ist in Ordnung mit ihm :-)

Model-Klasse

public class SourceLocation 
{ 
    [Key] 
    public int SourceLocationID { get; set; } 
    public int SourceID { get; set; } 

    [Required] 
    [Display(Name = "Product Type")] 
    [StringLength(25)] 
    public string ProductType { get; set; } 

    [Required] 
    [Display(Name = "Source Location")] 
    [StringLength(50)] 
    public string SamplingLocation { get; set; } 
    [Display(Name = "Sampling Location Notes")] 
    public string LocationNotes { get; set; } 
    public string SourceProductType 
    { 
     get 
     { 
      return CementSources.SampleSource + " " + ProductType + " ex " + SamplingLocation; 
     }   
} 

    public virtual CementSource CementSources { get; set; } 
} 

}

Der Regler SourceSampleType Referenzierung thusly konfiguriert ist.

// GET: Specifications/Create 
     public ActionResult Create() 
     { 
      ViewBag.FieldID = new SelectList(db.Fields, "FieldID", "FieldName"); 
      ViewBag.SourceLocationID = new SelectList(db.SourceLocations, "SourceLocationID", "SourceProductType"); 
      ViewBag.SpecificationTypeID = new SelectList(db.SpecificationTypes, "SpecificationTypeID", "SpecificationTypeName"); 
      return View(); 
     } 

Wenn ich versuche, eine neue Probe zu schaffen, die SourceSampleType zu zeigen, konfiguriert ist, der Fehler ist:


Es gibt bereits eine offene Datareader mit diesem Befehl zugeordnet, der zuerst geschlossen werden muss. Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es aus dem Code stammt.

Ausnahmedetails: System.InvalidOperationException: Mit diesem Befehl ist bereits ein offener DataReader verbunden, der zuerst geschlossen werden muss.

Quellfehler:

Line 28:    get 
Line 29:    { 
Line 30:     return CementSources.SampleSource + " " + ProductType + " ex " + SamplingLocation; 
Line 31:    } 
Line 32:   } 

Bin ich diese Syntax nicht richtig verwendet oder ist es etwas zu Eager/Lazy Loading verwandt, die ich noch analysieren und verstehen müssen?

+0

Ja seinen im Zusammenhang mit Bezug zu Eager/Lazy Loading. Sie müssen diese Eigenschaft entfernen. Stattdessen können Sie 'ViewBag.SourceLocationID = db.SourceLocations.AsEnumerable() verwenden. Wählen Sie (x => new SelectListItem {Value = x.SourceLocationID, Text = string.Format (" {0} {1} ex {2} ", x.CementSources.SampleSource, x.ProductType, x.SamplingLocation}); ' –

+0

Vielen Dank für die schnelle Antwort. Also habe ich die Eigenschaft getötet und diesen ViewBag in den Controller hinzugefügt. Also habe ich das ToString() Bit repariert und ausgeführt Ich habe das gleiche DataReader-Problem beim Versuch, ein Muster zu erstellen, gefunden. " Quellfehler: Zeile 66: ViewBag.SourceLocationID = db.SourceLocations.AsEnumerable().Wählen Sie (x => new SelectListItem {Wert = x.QuelleLocationID.ToString(), Text = Zeichenkette.Format ("{0} {1} ex {2}", x.CementSources.SampleSource, x.ProductType, x.SamplingLocation)}); ' –

+0

Das sollte nicht passieren, weil die Sammlung materialisiert wurde. Aber versuchen Sie es mit 'db.SourceLocations.Include (x => x.CementSources) .AsEnumerable() ......' –

Antwort

0

Der Fehler tritt auf, weil Sie die Ergebnisse von SourceLocation durchlaufen, aber in jeder Iteration eine weitere Abfrage ausführen, um den Wert seiner CementSources-Eigenschaft abzurufen.

Sie benötigen die SourceProductType Eigenschaft aus dem Modell zu entfernen, und Include() in der Abfrage verwenden, um umfassen CementSources