Ho appena iniziato a utilizzare EntityFramework 6 e sto ancora provando alcuni scenari. Ho sovrascritto il metodo OnModelCreating () nella mia classe di contesto e ho una certa logica per quanto riguarda alcuni mapping di nomi di colonne a proprietà come:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("public");
modelBuilder.Entity<Ninja>().Property(x => x.DateOfBirth).HasColumnName("date_of_birth");
}
Come puoi vedere il nome della proprietà è DateOfBirth, e la colonna appropriata nel DB è date_of_birth. Ora quando sto aggiungendo / inserendo nuovi dati nel DB questa mappatura funziona bene. E quando sto interrogando / recuperando dati come questo:
var ninja = context.Ninjas.FirstOrDefault(n => n.Name.StartsWith("Kacy"));
Funziona bene.
Ma quando voglio usare una funzione DB (postgre 10) per recuperare i dati:
private static void RetrieveDataWithStoredProc()
{
using (var context = new NinjaContext())
{
context.Database.Log = Console.WriteLine;
var ninjas = context.Ninjas.SqlQuery("select * from get_old_ninjas()").ToList();
}
}
Ottengo la seguente eccezione:
The data reader is incompatible with the specified 'NinjaDomain.DataModel.Ninja'.
A member of the type, 'DateOfBirth', does not have a corresponding column in the data reader with the same name.
Il che significa che non prende in considerazione la logica nel modelbuilder per quanto riguarda il nome della colonna della proprietà DateOfBirth. Se aggiungo logica di mappatura esplicita dopo SqlQuery, funzionerà ...
La mia domanda è: perché questo metodo non considera la logica già presente nel metodo OnModelCreating
come fanno tutti gli altri casi?
perché questo metodo non considera la logica già presente nel metodo OnModelCreating come fanno tutti gli altri casi?
Questa è una limitazione in EF6. EF Core rispetta le mappature delle colonne durante il caricamento da query SQL non elaborate:
I nomi delle colonne nel set di risultati devono corrispondere ai nomi delle colonne a cui sono associate le proprietà. Si noti che questo è diverso da EF6 in cui la mappatura delle proprietà / colonne è stata ignorata per le query SQL non elaborate e i nomi delle colonne dei set di risultati dovevano corrispondere ai nomi delle proprietà.