2010-11-28 28 views
2

J'ai une classe avec un IDictionary. La taille de cet objet n'est pas fixée à une taille particulière. L'idée avec ceci est d'avoir un schéma dynamique de mon objet. Je veux stocker cet objet dans le TableStorage. Comment puis-je faire ceci? Et comment puis-je récupérer cette information du magasin après ceci à l'intérieur de mon objet avec l'IDictionary encore ??Azure: Comment enregistrer IDictionary <String> sur TableStorage?

Merci!

Répondre

0

Les dictionnaires par défaut ne sont pas sérialisables. Un objet doit être sérialisable pour être enregistré dans TableStorage. Je vous suggère d'utiliser des objets de type List ou Array ou d'écrire votre propre sérialiseur pour Dictionary si List ou Arrays ne vous convient pas.

0

Vous pouvez utiliser les événements Lire et Écrire du TableStorageContext pour effectuer cela. Vous devez stocker le contenu IDictionary dans un autre champ ou dans un fichier BLOB. Dans l'événement Read, vous créez l'IDictionary à partir du champ donné ou réessayez directement à partir du fichier BLOB. Dans l'événement Write, vous stockez IDictionary dans le champ ou dans un fichier BLOB.

Important: L'événement Write se produit après l'étape de traduction de l'entité, puis si vous choisissez le champ, vous devrez peut-être écrire vos modifications directement dans la sérialisation XML de l'entité.

Cela semble dur, mais est très utile dans de nombreux scénarios

0

DynamicTableEntity prend IDictionary<string,EntityProperty> comme param.

Ce code est exécuté dans LinqPad:

void Main() 
{ 
var account = ""; 
var key = ""; 
var tableName = ""; 

var storageAccount = GetStorageAccount(account, key); 
var cloudTableClient = storageAccount.CreateCloudTableClient(); 
var table = cloudTableClient.GetTableReference(tableName); 

var partitionKey = "pk"; 
var rowKey = "rk"; 

//create the entity 
var entity = new DynamicTableEntity(partitionKey, rowKey, "*", 
    new Dictionary<string,EntityProperty>{ 
      {"Prop1", new EntityProperty("stringVal")}, 
      {"Prop2", new EntityProperty(DateTimeOffset.UtcNow)}, 
     }); 

//save the entity 
table.Execute(TableOperation.InsertOrReplace(entity)); 

//retrieve the entity 
table.Execute(TableOperation.Retrieve(partitionKey,rowKey)).Result.Dump(); 
} 

static CloudStorageAccount GetStorageAccount(string accountName, string key, bool useHttps = true) 
{ 
var storageCredentials = new StorageCredentials(accountName, key); 
var storageAccount = new CloudStorageAccount(storageCredentials, useHttps: useHttps); 
return storageAccount; 
}