/// <summary>
        /// Save a <see cref="CDP4Common.DTO.Thing"/> to a cache table
        /// </summary>
        /// <param name="transaction">The current transaction</param>
        /// <param name="partition">The database partition (schema) where the requested resource is stored.</param>
        /// <param name="thing">The revised <see cref="CDP4Common.DTO.Thing"/></param>
        public void Write(NpgsqlTransaction transaction, string partition, Thing thing)
        {
            var table = this.GetThingCacheTableName(thing);

            var columns  = string.Format("(\"{0}\", \"{1}\", \"{2}\")", IidKey, RevisionColumnName, JsonColumnName);
            var values   = "(:iid, :revisionnumber, :jsonb)";
            var sqlQuery = string.Format("INSERT INTO \"{0}\".\"{1}\" {2} VALUES {3} ON CONFLICT (\"{4}\") DO UPDATE SET \"{5}\"=:revisionnumber, \"{6}\"=:jsonb;", partition, table, columns, values, IidKey, RevisionColumnName, JsonColumnName);

            using (var command = new NpgsqlCommand(sqlQuery, transaction.Connection, transaction))
            {
                command.Parameters.Add("iid", NpgsqlDbType.Uuid).Value = thing.Iid;
                command.Parameters.Add("revisionnumber", NpgsqlDbType.Integer).Value = thing.RevisionNumber;
                command.Parameters.Add("jsonb", NpgsqlDbType.Jsonb).Value            = thing.ToJsonObject().ToString(Formatting.None);

                // log the sql command
                command.ExecuteNonQuery();
            }
        }