NpgSql - 如何从EF核心调用存储过程(void函数) - 异步

时间:2017-05-18 16:28:10

标签: c# postgresql entity-framework-core npgsql

我认为这里有几个问题。

首先,所有关于从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不支持命名参数等。

我还在摸索错误处理方面。我不想/需要等待 - 只需要一个回调函数来记录任何错误......

一如既往地帮助赞赏!

1 个答案:

答案 0 :(得分:1)

完成您尝试做的最简单的方法可能如下:

_context.Database.ExecuteSqlCommand("SELECT generate_accession_attributes({0})", AccessionId);

如果您不想使用异步,请调用ExecuteSqlCommand(同步版本)而不是ExecuteSqlCommandAsync。您可以在此之后放置日志记录行(而不是回调),任何问题都会像往常一样生成异常。