I’ve been messing with Azure Table Storage recently and needed to create a somewhat nontrivial data model to try some things.
This data model includes patients, patient addresses (email, IM, postal, phone, etc.) and patient events. I also wanted to store all of this data in the same table so I had table entities with differing schemas in the same table.
I then wrote some code to created an array of patients and for each patient I added the patient record and a random number of different patient addresses to the table.
The more I work with Windows Azure the more I come to the conclusion that debugging Windows Azure code is like a Doctor treating a patient, i.e. make random changes and see if that fixes the problem. Trying to figure out what the problem is from the exception information is like looking in a crystal ball in that it just doesn’t show anything other than what you can imagine.
Executing the code results in what appears to be one of the most common exceptions there is when working with Windows Azure:
So my next issue is that I had added multiple records so which one was causing the problem? To figure that out you need to enumerate the DataServiceRequestException.Response property. You get an IEnumerable<ChangeOperationResponse> collection from this property. From my experience so far there only ever appears to ever be one entity in this collection no matter how many records you create that would have had problems. What you look for is a header by the name of “Content-ID” on the OperationResponse. The value is the 1 based index of the records that were added before calling TableContext.SaveChangesWithRetries(SaveChangesOptions.Batch).
You can see this a lot better if you use Fiddler to view the input/output of the batch request. See http://learningbyfailing.com/2009/12/using-fiddler-with-azure-devstorage/ to see how to get Fiddler to display the output.
In my case it kept pointing to the second record that I added (the first was the patient record and the second was an address record). If I saved the patient record by itself it worked and if in a separate batch I saved the address records it worked. So in spite of the exception pretty much not telling me what the problem was I came to the conclusion that I can’t mix table entity schemas in a single batch. Apparently this is a restriction for development storage but will work when using cloud storage.
It’s too bad the exception didn’t tell me this.