DeleteDocumentAsync – PartitionKey value must be supplied

I was trying to delete a document in DocumentDB / CosmoDB and I was surprised to be faced with the error message of, ‘PartitionKey value must be supplied’. There doesn’t appear to be a way of passing the partition key to DeleteDocumentAsync. The trick is to use the request options. For example, if your collection is partitioned by ProductID;

await this.documentClient.DeleteDocumentAsync(productDocument._self, new RequestOptions { PartitionKey = new Microsoft.Azure.Documents.PartitionKey(productDocument.ProductID) });

The target “MSDeployPublish” does not exist in the project

Had a very strange issue this morning, create a new Azure Web project as usual, went to publish it and it refused to saying, ‘The target “MSDeployPublish” does not exist in the project’. So I compared the project with one of the ones that worked and for some weird reason it was missing the following line. Once added it published without issue.

<Import Project="..\packages\Microsoft.Web.WebJobs.Publish.1.0.12\tools\webjobs.targets" Condition="Exists('..\packages\Microsoft.Web.WebJobs.Publish.1.0.12\tools\webjobs.targets')" />

A method to compare blobs in different Azure blob storage accounts

I was recently asked to run a comparison of the blobs in two Azure Storage Accounts, where they should contain the same blob entries. However, some of the entries had been deleted from one account. Since it requires scanning the whole account it is expensive in cost and time. The fastest mechanism I found (and I’m sure there are better ways, please comment) was;

var blobsInBackupContainer = backupContainer.ListBlobs(useFlatBlobListing: true).OfType<CloudBlockBlob>().Select(b => b.Name);
var blobsInPrimaryContainer = primaryContainer.ListBlobs(useFlatBlobListing: true).OfType<CloudBlockBlob>().Select(b => b.Name);                

var missing = blobsInBackupContainer.Except(blobsInPrimaryContainer);
Console.WriteLine($"Missing count {missing.Count()}");
foreach (var item in missing)
{
    Console.WriteLine($"Missing item = {item}");
}