使用 C# 和 Dapper 的 Postgres JSONB 数据类型映射

Postgres JSONB Data Type Mapping using C# and Dapper

我有一个系统通过带有签名的 Postgres 函数审计数据库行 add/edit/delete 操作:

 func_audit_record(p_table_name  TEXT,
                   p_action_name TEXT,
                   p_old_row     JSONB,
                   p_new_row     JSONB,
                   p_edited_by   INTEGER)

到目前为止,此函数一直通过其他 Postgres 函数直接执行,但现在我需要直接通过 C# 执行它。

如何在保持上述签名的同时将 C# 数据类型映射到 Postgres JSONB 数据类型?

public async Task AuditAddAsync(string tableName, string actionName, JsonDocument oldRow, JsonDocument newRow, int appUserId)
    {
      var obj = new
      {
        p_audit_table_name = tableName,
        p_audit_action_name = actionName,
        p_old_row_state_as_text = oldRow, //JsonDocument object is too complex here
        p_new_row_state_as_text = newRow, //JsonDocument object is too complex here
        p_edited_by_user_id = appUserId,
        p_system_action = isSystemAction,
        p_notes = auditNotes
      };
      await _dapperAdapter.ExecuteAsync("func_audit_record", obj);
    }

我试过上面的 JsonDocumentRootElement 属性 中的结构似乎是正确的),但那太复杂了。此外,运行 JsonDocument.RootElement.ToString() 会引发错误,因为函数 func_audit_record 需要 JSONB,而不是 TEXT.

我真的不想用 TEXT 参数创建副本 func_audit_record。

想法?

您可以使您的代码正常工作。要将 json 传递给您的 plpgsql 函数,请使用 Dapper 的 ICustomQueryParameter,如

所示