2016-05-18 13 views
1

Sehr neu in ASP.NET MVC und Entity Framework.Ausnahme bei der Verwendung von ASP.NET MVC und Entity Framework

Ich versuche, eine Datenbank mit drei Tabellen einzurichten, wenn ich meinen Code ausführen und gehen Sie auf die Seite „Tickets“, erhalte ich die folgende Ausnahme:

Es gibt bereits eine offene Datareader zugeordnet mit diesem Befehl, der zuerst geschlossen werden muss.

Klasse 1

public class Ticket 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Description { get; set; } 
    [ForeignKey("Practice")] 
    public int PracticeID { get; set; } 

    public string Contact { get; set; } 
    public string Category { get; set; } 

    //insert Support type using ViewBag (Support type listed in Models.Practices) 
    [DataType(DataType.DateTime)] 
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime Due { get; set; } 

    [DataType(DataType.DateTime)] 
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime TimeLogged { get; set; } 

    [ForeignKey("Consultant")] 
    public int ConsultantID { get; set; } 
    public string ConsultantName { get; set; } 
    public string Status { get; set; } 

    public virtual Practice Practice { get; set; } 
    public virtual Consultant Consultant { get; set; } 
} 

Klasse 2:

public class Practice 
{ 
    [Key] 
    public int PracticeID { get; set; } 
    [Display(Name = "Practice Name")] 
    public string PracName { get; set; } 
    [Display(Name = "Practice Number")] 
    public int PracNumber { get; set; } 
    public string Contact { get; set; } 

    [Display(Name = "Support Type")] 
    public string Support { get; set; } 
    public string Tel { get; set; } 
    public string Cell { get; set; } 

    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 
    public string Address { get; set; } 
    public virtual List<Ticket> Ticket { get; set; } 
} 

Klasse 3:

public class Consultant 
{ 
    [Key] 
    public int ConsultantID { get; set; } 
    public string Name { get; set; } 

    [DataType(DataType.Password)] 
    public string Password { get; set; } 

    public string Role { get; set; } 
    public virtual List<Ticket> Ticket { get; set; } 
} 

ich eine Suchfunktion in meinem TicketsController haben:

public ActionResult Index(string searchString, string Consultants) 
{ 
     var UserLst = new List<string>(); 

     var UserQry = from d in db.Consultants 
         orderby d.Name 
         select d.Name; 

     UserLst.AddRange(UserQry.Distinct()); 
     ViewBag.User = new SelectList(UserLst); 

     var tickets = from m in db.Ticket 
         select m; 

     if (!String.IsNullOrEmpty(searchString)) 
     { 
      tickets = tickets.Where(s => s.Description.Contains(searchString)); 
     } 

     if (!string.IsNullOrEmpty(Consultants)) 
     { 
      tickets = tickets.Where(x => x.ConsultantName == Consultants); 
     } 

     return View(tickets); 
    } 

Der Fehler scheint von dem HTML-Code in dem INDEX zu stammen.

+0

Es ist wahrscheinlich, weil Sie 'db.Consultants' und dann' db.Ticket' abfragen und dazwischen Ihre Verbindung nie entsorgt wird. –

+0

in der Regel die Abfrage auf anderen DLL oder Layer ausgeführt wird das Problem ist der Bereich versuchen mit "mit" für die Entsorgung nach retrive Daten –

Antwort

1

Sie haben ein IQueryable von Ihrem Controller als Ihr Modell übergeben - in der Controller-Methode Tickets genannt. Wenn Sie für jede Schleife in dem Modell beginnen, beginnt EF, Ergebnisse über die Verbindung abzurufen, beendet die Verbindung jedoch nicht bis zum Ende der Schleife. Die Zeile, die den Fehler verursacht, versucht, auf die zugehörige Consultant-Eigenschaft zuzugreifen. Dadurch wird versucht, EF aus der Datenbank zu laden. Dies verursacht jedoch eine Ausnahme, da Sie sich noch in der Schleife befinden und die Verbindung weiterhin zum Abrufen der Tickets abfragen.

Der einfachste Weg ist, EF zu zwingen, die Ergebnisse vor der Schleife abzurufen. Ich würde gehen, um die letzte Zeile in der Steuerung in View (tickets.ToArray) oder ähnliches zu ändern.

Ich bin mir nicht sicher, aber die Aktivierung mehrerer aktiver Ergebnissätze könnte dies ebenfalls beheben.

+0

, die den Trick zu tun schien! Vielen Dank! – Blixem

Verwandte Themen