我认为这里有几个问题。
首先,所有关于从EF核心调用函数的文档似乎都假设我在等待结果集。 E.g:
_context.Set<MyEntity>().FromSql<MyEntity>("select myDbFunction({0})", myParam);
但是,我有一个后台工作,我想在插入或更新某些实体后运行(它编目一些json以便更快地搜索)。
这是我计划采取的方法,或类似的方法:
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);
}
但是,当然,Postgres不支持命名参数等。
我还在摸索错误处理方面。我不想/需要等待 - 只需要一个回调函数来记录任何错误......
一如既往地帮助赞赏!
答案 0 :(得分:1)
完成您尝试做的最简单的方法可能如下:
_context.Database.ExecuteSqlCommand("SELECT generate_accession_attributes({0})", AccessionId);
如果您不想使用异步,请调用ExecuteSqlCommand(同步版本)而不是ExecuteSqlCommandAsync。您可以在此之后放置日志记录行(而不是回调),任何问题都会像往常一样生成异常。