async Task <BotData> IBotDataStore <BotData> .LoadAsync(IAddress key, BotStoreType botStoreType, CancellationToken cancellationToken)
        {
            var entityKey = BotDataEntity.GetEntityKey(key, botStoreType);
            var result    = await this.Table.ExecuteAsync(TableOperation.Retrieve <BotDataEntity>(entityKey.PartitionKey, entityKey.RowKey));

            BotDataEntity entity = (BotDataEntity)result.Result;

            if (entity == null)
            {
                // empty record ready to be saved
                return(new BotData(eTag: String.Empty, data: null));
            }

            // return botdata
            return(new BotData(entity.ETag, entity.GetData()));
        }
        async Task IBotDataStore <BotData> .SaveAsync(IAddress address, BotStoreType botStoreType, BotData botData, CancellationToken cancellationToken)
        {
            var           table     = this.GetTable(address);
            var           entityKey = GetEntityKey(address, botStoreType);
            BotDataEntity entity    = new BotDataEntity(address.BotId, address.ChannelId, address.ConversationId, address.UserId, botData.Data)
            {
                ETag = botData.ETag
            };

            entity.PartitionKey = entityKey.PartitionKey;
            entity.RowKey       = entityKey.RowKey;

            if (String.IsNullOrEmpty(entity.ETag))
            {
                await table.ExecuteAsync(TableOperation.Insert(entity));
            }
            else if (entity.ETag == "*")
            {
                if (botData.Data != null)
                {
                    await table.ExecuteAsync(TableOperation.InsertOrReplace(entity));
                }
                else
                {
                    await table.ExecuteAsync(TableOperation.Delete(entity));
                }
            }
            else
            {
                if (botData.Data != null)
                {
                    await table.ExecuteAsync(TableOperation.Replace(entity));
                }
                else
                {
                    await table.ExecuteAsync(TableOperation.Delete(entity));
                }
            }
        }