Хранилище таблиц Azure — почему мои свойства bool и string сохраняются, а свойства int и double — нет?

#c# #azure

#c# #azure

Вопрос:

Похоже, это должна быть простая проблема, но мне трудно выделить ее.

У меня есть TableEntity класс, в который я пытаюсь записать Azure Table Storage :

 public class MyEntity : TableEntity
{
  public MyEntity(string imageId, string featureId)
  {
    this.PartitionKey = imageId;
    this.RowKey = featureId;
  }

  public string Container { get; set; }
  public bool FeatureEnabled { get; set; }
  public int data;
  public PointF Point;
  public double X;
  public double Y;

}
  

Я понимаю, что мое Point свойство не будет сохранено в хранилище таблиц. Но когда я вставляю этот объект, Container свойство и FeatureEnabled оба сохраняются, но больше ничего?

Как это может быть? int и double , как говорят, поддерживаются, так что я могу здесь делать не так?

Ответ №1:

Container И FeatureEnabled являются свойствами класса. Остальные — это просто поля. TableEntity будет выполняться только поиск и автоматическое сохранение свойств (поддерживаемых типов).

Поэтому преобразуйте данные, x и y в свойства, предоставляя get; set; их таким же образом, как и те, которые работают.

Комментарии:

1. Ах! В этом так много смысла! Спасибо! Я соглашусь, как только это позволит мне.

Ответ №2:

Вам нужно будет определить getter / setter для ваших свойств int / double:

 public class MyEntity : TableEntity
{
  public MyEntity(string imageId, string featureId)
  {
    this.PartitionKey = imageId;
    this.RowKey = featureId;
  }

  public string Container { get; set; }
  public bool FeatureEnabled { get; set; }
  public int data { get; set; }
  public PointF Point;
  public double X { get; set; }
  public double Y { get; set; }

}
  

Ответ №3:

TableEntity очень ограничен с точки зрения типов свойств, которые он поддерживает.

Если вы используете ObjectFlattenerRecomposer API, который я реализовал https://www.nuget.org/packages/ObjectFlattenerRecomposer /

Вы можете получить все свои свойства, включая свойство Point, записанные в хранилище таблиц, api также обрабатывает перекомпозицию исходного объекта обратно, когда вы считываете объект из хранилища таблиц.

Вот пример использования:

 using ObjectFlattenerRecomposer;

//Flatten object and convert it to EntityProperty Dictionary

Dictionary<string, EntityProperty> flattenedProperties = EntityPropertyConverter.Flatten(complexObject);

// Create a DynamicTableEntity and set its PK and RK

DynamicTableEntity dynamicTableEntity = new DynamicTableEntity(partitionKey, rowKey);

dynamicTableEntity.Properties = flattenedProperties;

// Write the DynamicTableEntity to Azure Table Storage using client SDK

//Read the entity back from AzureTableStorage as DynamicTableEntity using the same PK and RK

DynamicTableEntity entity = [Read from Azure using the PK and RK];

//Convert the DynamicTableEntity back to original complex object.

Imagine original complexObject was of type Order.

Order order = EntityPropertyConverter.ConvertBack<Order>(entity.Properties);