internal async Task <FluentResults.Result <IDictionary <string, string> > > Mutate(Api.Mutation mutation)
        {
            AssertNotDisposed();

            if (TransactionState != TransactionState.OK)
            {
                return(Results.Fail <IDictionary <string, string> >(new TransactionFinished(TransactionState.ToString())));
            }

            if (mutation.Del.Count == 0 &&
                mutation.DeleteJson.Length == 0 &&
                mutation.Set.Count == 0 &&
                mutation.SetJson.Length == 0)
            {
                return(Results.Ok <IDictionary <string, string> >(new Dictionary <string, string>()));
            }

            HasMutated = true;

            try {
                Api.Request req = new Api.Request();
                req.Mutations.Add(mutation);

                req.StartTs = Context.StartTs;
                var response = await Client.Mutate(req);

                if (mutation.CommitNow)
                {
                    TransactionState = TransactionState.Committed;
                }

                var err = MergeContext(response.Txn);
                if (err.IsFailed)
                {
                    return(err.ToResult <IDictionary <string, string> >());
                }

                return(Results.Ok <IDictionary <string, string> >(response.Uids));
            } catch (RpcException rpcEx) {
                // From Dgraph code txn.go
                //
                // Since a mutation error occurred, the txn should no longer be used
                // (some mutations could have applied but not others, but we don't know
                // which ones).  Discarding the transaction enforces that the user
                // cannot use the txn further.
                await Discard();                           // Ignore error - user should see the original error.

                TransactionState = TransactionState.Error; // overwrite the aborted value
                return(Results.Fail <IDictionary <string, string> >(new FluentResults.ExceptionalError(rpcEx)));
            }
        }