Penso che ci siano un paio di domande incorporate qui.
Innanzitutto, tutta la documentazione sulla chiamata di una funzione da nucleo EF sembra presupporre che sto aspettando un risultato. Per esempio:
_context.Set<MyEntity>().FromSql<MyEntity>("select myDbFunction({0})", myParam);
Tuttavia, ho un lavoro in background che voglio eseguire dopo aver inserito o aggiornato alcune entità (cataloga alcuni json per una ricerca più veloce).
Questo è l'approccio che stavo progettando di prendere, o qualcosa del genere:
private void AsyncQueryCallback(Task QueryTask)
{
if (QueryTask.Exception != null)
{
System.Diagnostics.Debug.WriteLine(QueryTask.Exception.ToString());
}
}
public void UpdateAccessionAttributes(int AccessionId)
{
var cancelToken = new System.Threading.CancellationToken();
var idParam = new Npgsql.NpgsqlParameter("accessionId", NpgsqlTypes.NpgsqlDbType.Integer);
idParam.Value = AccessionId;
_context.Database.ExecuteSqlCommandAsync("generate_accession_attributes @accessionId", cancelToken, new[] { idParam }).ContinueWith(AsyncQueryCallback);
}
Ma, naturalmente, Postgres non supporta i parametri denominati, ecc.
Sto anche armeggiando un po 'sulla gestione degli errori. Non voglio / devo aspettare - ho solo bisogno di una funzione di callback per registrare eventuali errori ...
Aiuto apprezzato, come sempre!
Il modo più semplice per realizzare ciò che stai cercando di fare è probabilmente il seguente:
_context.Database.ExecuteSqlCommand("SELECT generate_accession_attributes({0})", AccessionId);
Se non si desidera utilizzare async, quindi chiamare ExecuteSqlCommand (la versione di sincronizzazione) anziché ExecuteSqlCommandAsync. È possibile posizionare la linea di registrazione subito dopo (anziché una richiamata) e qualsiasi problema genererà un'eccezione come al solito.