Attualmente, sto lavorando su un sito web Asp.Net Core e utilizzo Entity Framework Core (attualmente RC1) per l'accesso al database con SQL Express LocalDB sul computer di sviluppo, sebbene MS SQL sul server di prova fornisca lo stesso errore.
Ho riscontrato un problema che durante la query su più livelli di proprietà di navigazione sarebbe stato generato SQL non valido. Ho creato il seguente codice di test per riprodurre il problema:
4 Classi che rappresentano le tabelle del database
public class CarManufacturer
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<CarModel> CarModels { get; set; }
}
public class CarModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public Guid CarManufacturerId { get; set; }
public CarManufacturer CarManufacturer { get; set; }
public List<CarTestDriver> CarTestDrivers { get; set; }
}
public class CarTestDriver
{
public Guid Id { get; set; }
public string Name { get; set; }
public Guid CarModelId { get; set; }
public CarModel CarModel { get; set; }
public List<SpeedingTicket> SpeedingTickets { get; set; }
}
public class SpeedingTicket
{
public Guid Id { get; set; }
public decimal Amount { get; set; }
public Guid CarTestDriverId { get; set; }
public CarTestDriver CarTestDriver { get; set; }
}
DbSets nella classe Context
public DbSet<CarManufacturer> CarManufacturers { get; set; }
public DbSet<CarModel> CarModels { get; set; }
public DbSet<CarTestDriver> CarTestDrivers { get; set; }
public DbSet<SpeedingTicket> SpeedingTickets { get; set; }
Ora creo una query linq per darmi la quantità totale di biglietti ordinati dai produttori
var ticketCostByManufacturers = Context.CarManufacturers
.Select(manufacturer => new
{
manufacturer.Name,
TotalTicketAmount = manufacturer.CarModels.SelectMany(model => model.CarTestDrivers).SelectMany(driver => driver.SpeedingTickets).Sum(ticket => ticket.Amount)
})
.ToList();
Che fa due cose:
Esegue una query su tutti i ticket con il seguente SQL non valido: (solo quando la prima query restituisce risultati)
SELECT [model].[Id],
[model].[Amount],
[model].[CarTestDriverId],
[model].[CarManufacturerId], -- Invalid Column
[model].[Id],
[driver].[Id],
[ticket].[Amount]
FROM [SpeedingTicket] AS [model]
CROSS JOIN [CarTestDriver] AS [driver]
CROSS JOIN [SpeedingTicket] AS [ticket]
La query CarManufacturerId
un'eccezione a causa di un nome di colonna non valido CarManufacturerId
sulla tabella per l'entità SpeedingTicket
, poiché la query seleziona [SpeedingTicket] AS [model]
.
Ho sperimentato .Include()
così come con l'API Fluent, ma entrambi non mi hanno portato a una soluzione su come utilizzare correttamente Entity Framework Core qui per eseguire la query.
Il messaggio di eccezione indica che il mio modello e il database non sono sincronizzati e dovrei creare una nuova migrazione, ma in realtà sono sincronizzati. Immagino che questo suggerimento provenga da EF assumendo una mancata corrispondenza dello schema del database quando non viene trovata una colonna.
Modifica per chiarimenti:
L'intenzione della domanda era di scoprire se si tratta di un errore nel mio setup (come la mancata configurazione con l'API di Fluent) o se è ancora un bug nella versione corrente di Entity Framework Core. @Ivan Stoev ha fatto notare che è quest'ultimo, un bug nel codice corrente di Entity Framework.
Come ho capito, non ci sono problemi con il codice del framework di entità. Uscita del codice quadro dell'entità . Ma nella query Sql [modello] menzionata qui è la tabella [SpeedingTickets] creata dal framework di entità. Quella tabella non contiene alcuna chiamata di colonna [CarManufacturerId]. Questo è l'errore.