NpgSql - 如何从 EF 核心异步调用存储过程(void 函数)
NpgSql - How to call a stored procedure (void function) from EF core - asynchronously
我认为这里有几个问题。
首先,所有关于从 EF 核心调用函数的文档似乎都假定我正在等待结果集。例如:
_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 不支持命名参数等
我在错误处理方面也有点摸不着头脑。我不 want/need 等待 - 只需要一个回调函数来记录任何错误...
帮助感谢,一如既往!
完成您想要完成的任务的最简单方法可能如下:
_context.Database.ExecuteSqlCommand("SELECT generate_accession_attributes({0})", AccessionId);
如果您不想使用异步,则调用 ExecuteSqlCommand(同步版本)而不是 ExecuteSqlCommandAsync。您可以在之后放置日志行(而不是回调),任何问题都会像往常一样生成异常。
我认为这里有几个问题。
首先,所有关于从 EF 核心调用函数的文档似乎都假定我正在等待结果集。例如:
_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 不支持命名参数等
我在错误处理方面也有点摸不着头脑。我不 want/need 等待 - 只需要一个回调函数来记录任何错误...
帮助感谢,一如既往!
完成您想要完成的任务的最简单方法可能如下:
_context.Database.ExecuteSqlCommand("SELECT generate_accession_attributes({0})", AccessionId);
如果您不想使用异步,则调用 ExecuteSqlCommand(同步版本)而不是 ExecuteSqlCommandAsync。您可以在之后放置日志行(而不是回调),任何问题都会像往常一样生成异常。