2016-07-13 95 views
1

Azure-Tabelle 'Zusammenführen' führt den Wert von Datum nicht zusammen, wenn der Datumswert für diesen Datensatz in der Tabelle vorhanden ist wenn wir beim Zusammenführen explizit null an das Nullable-Feld übergeben.Azure-Tabelle "Zusammenführen" ersetzt Felder, für die der übergebene Wert null ist (Beispiel: Nullable <Date> Feld) C#

Ich kann 'Replace' nicht verwenden, da die im Code definierte TableEntity nur eine Teilmenge der eigentlichen Tabelle mit definierten und initialisierten Kernfeldern ist. Ersetzen entfernt andere hinzugefügte dynamische Felder.

Antwort

1

Was Sie beobachten, ist das erwartete Verhalten von Merge Entity Betrieb. Aus der Dokumentation:

Alle Eigenschaften mit Nullwerten werden von dem Merge-Entity Betrieb ignoriert. Alle anderen Eigenschaften werden aktualisiert.

Eine Eigenschaft kann nicht mit einer Merge-Entity-Operation entfernt werden. Um eine Eigenschaft aus einer Entität zu entfernen, ersetzen Sie die Entität durch Aufrufen der Entität "Update ".

Neben String Datentyp in dem Sie den Wert als null, andere Datentypen nicht unterstützen null einstellen. Wenn Sie für diese Attribute einen Wert von null festlegen, bedeutet dies lediglich, dass Sie sie nicht in der Entität speichern möchten.

Ich denke, die einzige verfügbare Option ist Replace (Update) die Entität, aber basierend auf den Informationen, die Sie bereitgestellt haben, sieht es so aus, als ob Sie diese Option nicht wirklich verwenden können.

+0

Gibt es eine Abhilfe zur Verfügung. Hier kann ich alle Felder in DynamicTableEntity abrufen und nur eine Teilmenge der Felder mit den aktuellen TableEntity-Datensatzwerten aktualisieren und DynamicTableEntity in der Tabelle durch "Replace" ersetzen. –

+0

Ja, das ist in der Tat eine Möglichkeit. Rufen Sie Daten in einer 'DynamicTableEntity' ab und arbeiten Sie damit. –

0

Dies ist das solution.so weit

  • Entity der aktuelle aktualisierte Datensatz ist, die in der Tabelle ersetzt werden muss. (Entity Datensatz hat Teilmenge der Felder in der Tabelle, für die Nullwerte übergeben werden) .

Jede Optimierung oder Vorschläge sind willkommen.

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); 
      }