Provo a caricare un'entità con EF Core chiamando una stored procedure. L'entità viene mappata a una tabella tramite una mappatura fluente che non contiene tutte le colonne selezionate dalla stored procedure.
I campi selezionati che non esistono come colonne della tabella vengono ignorati nella configurazione dell'entità in questo modo:
modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Latitude);
modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Longitude);
modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Radius);
modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Distance);
La procedura memorizzata è chiamata così:
await SalesContext.CustomerLocation
.FromSql("GetCustomersByLocation @latitude={0}, @longitude={1}, @radius={2}", lat,
lon, radius)
.ToListAsync();
Quando viene eseguita la query, le colonne ignorate non vengono mappate all'entità. C'è qualche possibilità di mappare i campi ignorati all'entità quando si chiama una stored procedure o devo creare un'altra entità per la stored procedure o qualcosa di simile?
Quando si utilizza il metodo ignore di api fluente sulla colonna, non creerà quella colonna in SQL Server (la ignora).
Il risultato della stored procedure ti darà alcune colonne in base alla query creata e questi nomi di colonna devono corrispondere ai nomi di proprietà della tua entità.
Ad esempio la tua procedura ti fornisce una tabella con queste colonne e anche i tipi di dati corrispondenti in sql server e la tua classe:
Quindi dovresti creare una classe per la tua procedura:
public class LocationProcedure {
public string Latitude {get;set;}
public string Longitude {get;set;}
public string Radius {get;set;}
public string Distance {get;set;}
}
e aggiungi anche un dbset di questo tipo al tuo dbContext con l'attributo [NotMapped]
:
[NotMapped]
public DbSet<LocationProcedure> CustomerLocation {get; set:}
L'attributo dice che questo non dovrebbe essere una tabella nel database.
Finalmente puoi usare la tua procedura con la nuova dbset CustomerLocation
e quindi assocerà i risultati alla classe LocationProcedure .
await SalesContext.CustomerLocation
.FromSql("GetCustomersByLocation @latitude={0}, @longitude={1}, @radius={2}", lat,
lon, radius)
.ToListAsync();