Assim, minha compreensão do Event Sourcing é que você recria seu objeto a partir de eventos salvos, em vez da tradicional desserialização do estado do objeto. Parece que você não está realmente fazendo isso.
Porque a ordem dos eventos é geralmente importante. Isso exige alguma forma de transação manual, na qual você atribui IDs de eventos sequenciais ou um número de versão e pode informar se outro evento aconteceu enquanto você estava processando o evento em que você está trabalhando. ou seja,
- Carregar documento
- ler o número da versão antiga / última identificação do evento
- adicionar imagem com o ID do evento
- atualizar o número da versão
- sobregravar doc se o número da versão for o mesmo / nenhum evento mais tiver sido adicionado
- SE a versão foi alterada desde o início, refaça a operação.
Obviamente, isso não funciona bem se você tiver muitas colisões, pois está sempre refazendo as etapas. Além disso, você ainda precisa de algum tipo de transação suportada pelo banco de dados para a etapa final.
No entanto, vejo que o DocumentDb suporta transações:
Does DocumentDB support ACID transactions?
Yes, DocumentDB supports cross-document transactions expressed as JavaScript stored procedures
Sugiro que você crie uma transação reutilizável simples que apenas verifique se o número da versão do documento é o esperado. Você pode usar isso com todos os seus eventos.