2016-07-13 1 views
1

Azure Table 'Merge' ne fusionne pas la valeur de date si la valeur de date de cet enregistrement existe dans la table et si nous passons explicitement null à ce champ Nullable lors de la fusion.La table Azure 'Merge' ne remplace pas les champs dont la valeur est null (ex: champ <Date>) C#

Je ne peux pas utiliser 'Replace' car TableEntity défini dans le code est juste un sous-ensemble de la table réelle avec les champs de base définis et initialisés. Remplacer supprimera les autres champs dynamiques ajoutés.

Répondre

1

Ce que vous observez est le comportement attendu de Merge Entity opération. De la documentation:

Toutes les propriétés des valeurs nulles sont ignorées par l'opération de fusion Entité . Toutes les autres propriétés seront mises à jour.

Une propriété ne peut pas être supprimée avec une opération d'entité de fusion. Pour supprimer une propriété d'une entité, remplacez l'entité en appelant l'opération Entité de mise à jour .

Outre String type de données où vous pouvez définir la valeur comme null, d'autres types de données ne prennent pas en charge null. Définir une valeur de null sur ces attributs signifie simplement que vous ne voulez pas les stocker dans l'entité.

Je suppose que la seule option à votre disposition est Replace (Update) l'entité mais en fonction des informations que vous avez fournies, il semble que vous ne puissiez pas vraiment utiliser cette option.

+0

Y at-il solution de contournement disponible. Où je peux récupérer tous les champs dans DynamicTableEntity et mettre à jour juste un sous-ensemble des champs avec les valeurs d'enregistrement TableEntity actuelles et «Remplacer» le DynamicTableEntity dans la table. –

+0

Oui, c'est effectivement une possibilité. Récupérer des données dans un DynamicTableEntity et travailler avec cela. –

0

Ceci est la solution.so loin

  • entité est le courant enregistrement mis à jour qui doit être remplacé dans le tableau. (Détail entité a sous-ensemble des champs de la table pour laquelle sont transmises les valeurs nulles) .

Toute optimisation ou suggestion sont les bienvenues.

Code Snippet

TableQuery<DynamicTableEntity> rangeQuery = new TableQuery<DynamicTableEntity>().Where(
        TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, Entity.PartitionKey), 
          TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, Entity.RowKey))); 

      DynamicTableEntity CurrTblRec = table.ExecuteQuery(rangeQuery).FirstOrDefault(); 
      if (CurrTblRec != null) 
      { 
       OperationContext OpContext = new OperationContext(); 
       DynamicTableEntity EntityDyn = new DynamicTableEntity(); 

       IDictionary<string, EntityProperty> EntityKV = TableEntity.WriteUserObject(Entity, OpContext); 

       Dictionary<string, EntityProperty> ExtraFldLt = CurrTblRec.Properties.Where(x => !EntityKV.ContainsKey(x.Key)).ToDictionary(x => x.Key, x => x.Value); 

       EntityDyn.ReadEntity(EntityKV, OpContext); 

       foreach (var AdditionalField in ExtraFldLt) 
        EntityDyn.Properties.Add(AdditionalField); 

       EntityDyn.PartitionKey = Entity.PartitionKey; 
       EntityDyn.RowKey = Entity.RowKey; 
       EntityDyn.ETag = "*"; 

       TableOperation ReplaceEntity = TableOperation.Replace(EntityDyn); 
       tblRes = table.Execute(ReplaceEntity); 
      } 
      else 
      { 
       TableOperation insertOperation = TableOperation.Insert(Entity); 
       table.Execute(insertOperation); 
      }