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。您可以在之后放置日志行(而不是回调),任何问题都会像往常一样生成异常。