Il tipo di entità "Microsoft.AspNet.Mvc.Rendering.SelectListGroup" richiede una chiave da definire

asp.net-core-mvc asp.net-mvc c# entity-framework entity-framework-core

Domanda

Non sono sicuro di cosa sia successo, ma sto riscontrando il seguente errore durante il tentativo di aprire qualsiasi visualizzazione nella mia app web. Il codice è generato automaticamente da Visual Studio e non ricevo errori prima della creazione. Utilizzo di ASP.Net MVC 6, EF7.

Un'eccezione di tipo "System.InvalidOperationException" si è verificata in EntityFramework.Core.dll ma non è stata gestita nel codice utente

Ulteriori informazioni: il tipo di entità "Microsoft.AspNet.Mvc.Rendering.SelectListGroup" richiede una chiave da definire.

Ecco la riga su cui si sta verificando il codice.

public IActionResult Index()
{
    var schoolContext = _context.Schools
                                .Include(s => s.District)
                                .Include(s => s.Location)
                                .Include(s => s.Tier);
    return View(schoolContext.ToList());
}

Dopo alcune ricerche non riesco a capire esattamente cosa devo correggere. Questo funzionava a un certo punto. Non sono sicuro di cosa sia cambiato.

La vista ha una defenizione

@model IEnumerable<School>

Come richiesto qui è il modello School

public class School
{
    //Original Fields
    public int SchoolId { get; set; }

    [Display(Name = "Name")]
    public string SchoolName { get; set; }

    [Display(Name = "Date Added")]
    public DateTime SchoolDateAdded { get; set; }

    [Display(Name = "Last Update")]
    public DateTime SchoolLastUpdate { get; set; }

    [Display(Name="Updated By")]
    public string SchoolUpdatedBy { get; set; }

    //Referance Fields
    public int DistrictId { get; set; }
    public IEnumerable<SelectListItem> DistrictList { get; set; }
    public int LocationId { get; set; }
    public IEnumerable<SelectListItem> LocationList { get; set; }
    public int TierId { get; set; }
    public IEnumerable<SelectListItem> TierList { get; set; }

    //Navigation Property
    public District District { get; set; }
    public Location Location { get; set; }
    public Tier Tier { get; set; }
}

Risposta accettata

Questi elementi IEnumerable<SelectListItem> non dovrebbero far parte del modello EF. Ricorda il principio della singola responsabilità . Mantieni qualsiasi framework UI lontano dalla tua implementazione DAL. Usa un modello di vista che rappresenta una School .

Per quanto riguarda l'errore, dal punto di vista di EF, School ha un'associazione 1-n con SelectListItem , quindi tenta di renderlo parte dello schema di mapping. Ma ogni tipo mappato ha bisogno di una chiave primaria, che ovviamente non è mappata, e EF non può inferirne nessuna.

Una soluzione rapida, ma sporca, sarebbe escludere le proprietà dall'essere mappate dall'attributo [NotMapped] , ma una migliore segregazione del codice è il vero rimedio.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché