public async Task Process(IncomingStepContext context, Func <Task> next) { var message = context.Load <Message>(); var messageId = message.GetMessageId(); var transactionContext = context.Load <ITransactionContext>(); var messageData = await _msgStorage.Find(messageId) ?? new MessageData() { MessageId = messageId }; TryMountMessageDataOnTransactionContext(messageData, transactionContext); // invoke the rest of the pipeline (most likely also dispatching the incoming message to the now-ready saga handlers) await next(); // everything went well - let's save message data await SaveMessageData(messageData); }