Как правильно использовать TableEntity.Flatten в Microsoft. Azure .Cosmos.Table? - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь сохранить объект json из моего проекта API в CosmosDB с помощью Microsoft. Azure .Cosmos.Table. Мой Json выглядит следующим образом:

{
  "age": 0,
  "type": "network-error",
  "url": "https://www.example.com/",
  "body": {
    "sampling_fraction": 0.5,
    "referrer": "http://example.com/",
    "server_ip": "2001:DB8:0:0:0:0:0:42",
    "protocol": "h2",
    "method": "GET",
    "request_headers": {},
    "response_headers": {},
    "status_code": 200,
    "elapsed_time": 823,
    "phase": "application",
    "type": "http.protocol.error"
  }
}

И мой Космос имеет API типа Table, поэтому мне нужно сплющить его, но я не смог найти способ сделать это наиболее обобщенным c способом Документация MSDN не имеет ничего общего с реализацией.

Большое спасибо, ценим ваше время и помощь.

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Создайте класс. Net для вашей модели и передайте его TableEntity.Flatten. Затем можно использовать возвращенный словарь пар сплющенного ключа и значения EntityProperty, чтобы создать класс DynamicTableEntity, указав ключи раздела и строки. И вы можете вставить это в хранилище таблицы cosmos db.

Использование должно быть аналогично тому, как оно использовалось в API Table Storage. Посмотрите на модульные тесты здесь: https://github.com/Azure/azure-storage-net/commit/daff940a506b27650901b9b9feb59131ffacce6d

ShapeEntity shapeEntity = new ShapeEntity(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "square", 4, 4);
            OperationContext operationContext = new OperationContext();

            DynamicTableEntity dynamicTableEntity = new DynamicTableEntity(shapeEntity.PartitionKey, shapeEntity.RowKey)
            {
                Properties = TableEntity.Flatten(shapeEntity, operationContext)
            };

, и вы можете записать это DynamicTableEntity в Cosmos DB с помощью SDK.

Чтобы прочитать сплющенный DynamicTableEntity обратно в сложный объект, когда вы читаете его, вам нужно использовать TableEntity.ConvertBack api.

0 голосов
/ 03 марта 2020

Исходя из документа, который вы опубликовали выше, будет более целесообразно использовать API SQL / Mon go для хранения данных в cosmosdb, так как документ выглядит как JSON.

* 1002. * Как вы упомянули в комментарии, если другие таблицы являются реляционными, я бы порекомендовал вам go через data modelling и разработать ваши таблицы

, если Вы все еще хотите сохранить его в табличном хранилище, преобразовать json в модель и сериализовать его перед вставкой, используя Flatten

public class RequestHeaders
{
}

public class ResponseHeaders
{
}

public class Body
{
    public double sampling_fraction { get; set; }
    public string referrer { get; set; }
    public string server_ip { get; set; }
    public string protocol { get; set; }
    public string method { get; set; }
    public RequestHeaders request_headers { get; set; }
    public ResponseHeaders response_headers { get; set; }
    public int status_code { get; set; }
    public int elapsed_time { get; set; }
    public string phase { get; set; }
    public string type { get; set; }
}

public class RootObject
{
    public int age { get; set; }
    public string type { get; set; }
    public string url { get; set; }
    public Body body { get; set; }
}
...