Ajouter ou remplacer l'entité dans Azure Table Storage
Je travaille avec Windows Azure Table Storage et ont une simple exigence: ajouter une nouvelle ligne, en remplaçant la ligne existante avec qui PartitionKey/RowKey. Toutefois, en enregistrant les modifications jette toujours une exception, même si je passe dans le ReplaceOnUpdate option:
tableServiceContext.AddObject(TableName, entity);
tableServiceContext.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate);
Si l'entité qui existe déjà, il lance:
System.Data.Services.Client.DataServiceRequestException: An error occurred while processing this request. ---> System.Data.Services.Client.DataServiceClientException: <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>EntityAlreadyExists</code>
<message xml:lang="en-AU">The specified entity already exists.</message>
</error>
Dois-je vraiment une requête manuelle de la ligne existante d'abord et appeler DeleteObject
sur elle? Qui semble très lent. Il y a sûrement un meilleur moyen?
OriginalL'auteur EMP | 2010-12-17
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez trouvé, vous ne pouvez pas ajouter un autre élément qui a la même ligne de clé et la clé de partition, de sorte que vous aurez besoin pour exécuter une requête pour vérifier si l'élément existe déjà. Dans ce cas là, je trouve qu'il est utile de regarder la Azure API REST pour voir ce qui est disponible pour le stockage de la bibliothèque du client. Vous verrez que il y a différentes méthodes pour insérer et mise à jour. Le ReplaceOnUpdate n'a d'effet que lorsque vous faites une mise à jour, pas de l'insérer.
Alors que vous pourriez supprimer l'élément existant, puis l'ajout de la nouvelle, vous pouvez simplement mettre à jour l'existant (vous permet d'économiser un aller-retour pour le stockage). Votre code pourrait ressembler à quelque chose comme ceci:
EDIT: Alors que correcte au moment de l'écriture, avec le mois de septembre 2011 mise à jour de Microsoft ont mis à jour l'Azure table API pour inclure deux upsert commandes, Insérer ou Remplacer Entité et Insérer ou de Fusion de l'Entité
CopyTo
méthode) et il doit être mis à jour chaque fois que le changement de propriété. Je crois que je préfère payer le prix de la supprimer et d'en être sûr.Eh bien, j'ai fini par faire cela, autant que j'en avais pas envie. Peu importe combien j'ai essayé de supprimer et de re-insertion de l'entité qu'elle n'a tout simplement pas de travail realiably - une fois, elle allait réussir, la prochaine fois échouer avec une erreur, la prochaine fois échouer avec l'autre.
Je trouve cela surprenant. Étiez-vous en essayant de sauver à la fois le complément et le supprimer dans le cadre de l'un .Save() de l'appel, ou étiez-vous en train de faire .AddObject(); .Save(); .DeleteObject(); .Save();
OriginalL'auteur knightpfhor
Afin de fonctionner sur un objet existant ne sont PAS gérés par le TableContext avec les Supprimer ou les SaveChanges avec ReplaceOnUpdate options, vous devez appeler AttachTo et attacher l'objet de la TableContext, au lieu d'appeler AddObject qui indique TableContext pour tenter de l'insérer.
http://msdn.microsoft.com/en-us/library/system.data.services.client.dataservicecontext.attachto.aspx
Désolé, il n'a pas lu assez attentivement le problème initial. Vous aurez besoin de faire une lecture avant de la main. N'avez pas besoin de supprimer cette ligne. Juste faire une mise à Jour en place si la ligne existe ou insérer si elle ne marche pas. Pas de l'éviter.
OriginalL'auteur Igorek
dans mon cas, il n'était pas autorisé à retirer tout d'abord, donc je fais comme ça, cela résultera en une seule transaction au serveur qui va d'abord supprimer un objet existant et que d'en ajouter de nouveaux, en supprimant le besoin de copier des valeurs de propriété
OriginalL'auteur zebra
L'API de Stockage ne permettent pas plus d'une opération par entité (delete+insert) dans un groupe de transaction:
voir MSDN: arts du Spectacle, Entité du Groupe Transactions
Donc, en fait, vous avez besoin de lire d'abord et décider lors de l'insertion ou de mise à jour.
OriginalL'auteur fabsenet
Insérer/de Fusion ou de mise à Jour a été ajouté à l'API en septembre 2011. Voici un exemple d'utilisation de l'API de Stockage 2.0 qui est plus facile à comprendre que la façon dont c'est fait dans la 1.7 api et plus tôt.
OriginalL'auteur lockwobr