Sto avendo un problema piuttosto strano con EF. Sto visualizzando un elenco di scenari con un MfgSite associato a ciascuno di essi. Di seguito sono i modelli:
//Models
public partial class Scenario
{
public string Name { get; set; }
public bool IsFinal { get; set; }
public Guid Uid { get; set; }
public string Username { get; set; }
public string Description { get; set; }
public Guid MfgSiteUid { get; set; }
//navigation property
public MfgSite MfgSiteU { get; set; }
}
public partial class MfgSite
{
public string MfgSiteCommonName { get; set; }
public string MfgSiteState { get; set; }
public string MfgSiteFunction { get; set; }
public string MfgSiteDesc { get; set; }
public Guid Uid { get; set; }
//navigation property
public Scenario Scenario { get; set; }
}
Nel mio Scenario controller Index Action ho questo codice qui sotto (nota che ho generato modelli da db prima usando Scaffold-DbContext ). L'elenco restituito ha MfgSiteU impostato su null su tutti tranne una voce per ogni MfgSiteUid univoco nello scenario.
//Scenario Controller Index Action
public async Task<IActionResult> Index()
{
var sContext = _context.Scenario.Include(s => s.MfgSiteU);
return View(await sContext.ToListAsync());
}
Quando viene visualizzato nella vista (non tutte le colonne sono mostrate) assomiglia a questo:
Le colonne vuote sono perché s.MfgSiteU è nullo anche se s.MfgSiteUid è preciso e non nullo. MfgSiteCommonName avrebbe dovuto essere "Sito di test 1" per la seconda riga e "Sito di test 2" per la terza e quarta riga.
Cosa potrebbe causare questo problema e quali sono le potenziali correzioni? Come parte del mio debug, ho provato a navigare uno scenario alla volta usando foreach su DbSet e aggiungendo ognuno a List manualmente. Ho potuto vedere che MfgSiteU non è nullo su quelli singoli, ma alcuni come reimposta i precedenti a null una volta che iterare verso la fine.
Cosa potrebbe causare questo problema e quali sono le potenziali correzioni?
Il problema è che, in base ai dati di esempio, la relazione tra Scenario
e MfgSite
è molti-a-uno , mentre la relazione generata è uno-a-uno . EF Core utilizza la cardinalità delle relazioni durante la generazione dei join SQL necessari per caricare i dati correlati, il che può portare a risultati errati quando la relazione non viene mappata correttamente.
La correzione è di sostituire la proprietà di navigazione in MfgSite
da
public Scenario Scenario { get; set; }
a
public ICollection<Scenario> Scenarios { get; set; }
A causa del motivo per cui il comando scaffold ha creato una relazione errata, non posso rispondere senza avere il modello del database. Nel caso in cui si potesse fornire un database di esempio che riproduce il problema, suggerirei di aprire un problema in EFC Tracker.