Hi Pete,
I think I don't yet understand what's the exact problem or what you're trying to achieve, so let's start with some questions/suggestions
1. Why do you SetCompleted when a validation fails? SetCompleted will complete the saga (but you can't throw exceptions then)
2. Throwing an exception from a message handler or a saga will always roll back the transaction. Then the exception information will be stored in error_info column in the failing message record, and message will be re-scheduled for a retry later.
3. error_info column is meant for storing last error information if message processing ends with an error. It's filled automatically when an exception occurs, there's no api to set it manually from your code.
4. PermanentMessageProcessingException informs the message bus that there's no point in retrying the message because the error will not go away. It will mark message as failed (F) and won't attempt to process it again.
Please provide more info about your code if my explanations aren't relevant
Rafal