I'm designing and implementing .Net ORM that must support both Azure Storage (tables, queues, blobs) and AWS Storage (EBS, SimpleDB, S3) and hide all implementation details behind a common interface. The major design goal is simplicity.
Some of the work has been done in http://www.cs.virginia.edu/~humphrey/papers/CSAL.pdf, but their proposed interface is, in my opinion, too tightly coupled with Azure/AWS Storage interface and is likely to break should new features are added or old ones changed. For example, I don't care that I can create/delete tables, I only need to store an object of some type in a most efficient way.
So, I would like to ask you to share your experience on the subject in a form of guidelines (DO, CONSIDER, AVOID, DO NOT). I would really appreciate any insight starting with general principles of designing ORM and finishing with the precise level of abstraction that is more likely to last considering the most probable evolution paths of Azure and AWS.