Миграция с Microsoft.Azure.DocumentDb на Microsoft.Azure.Cosmos

Поскольку пакет Microsoft.Azure.DocumentDB устарел, я нахожусь в процессе миграции нашей кодовой базы для доступа к CosmosDB из Microsoft.Azure.DocumentDB версии 2.11.6 для использования Microsoft.Azure.Cosmos версии 3.31.1.

Я использовал приведенные ниже ссылки и перенес часть кода.

Миграция с Microsoft.Azure.DocumentDb на Microsoft.Azure.Cosmos для доступа к данным. Доступны не все вариантыhttps://learn.microsoft.com/en-us/azure/cosmos-db/nosql/migrate-dotnet-v3?tabs=dotnet-v3https://elcamino.cloud/articles/2019-11-05-cosmos-net-sdk-v3-upgrade-guide-and-tips.html

Но похоже, что все классы и функции доступны в новом пакете.

Для классов ниже я не смог найти замену...

  1. Документ
  2. Ресурс (можно использовать JSONDocument)
  3. Условия доступа
  4. AccessConditionType

Моя кодовая база сильно зависит от свойств, поставляемых с такими классами, как id, Timestamp, SelfLink и т. д.

Как я могу добиться того же с новым пакетом Cosmos.

  public class WorkPlay : Resource
    {
        [JsonProperty(PropertyName = "WorkTypeEnum")]
        public string WorkTypeEnum { get; set; }

        [JsonProperty(PropertyName = "MediaType")]
        public string MediaType { get; set; }

        [JsonProperty(PropertyName = "Product")]
        public string Product { get; set; }
}

AccessCondition ac = new AccessCondition { Type = AccessConditionType.IfNoneMatch };
this._client = new DocumentClient(new Uri(this._endpoint), this._authKey);
ResourceResponse<Document> response = await this._client.ReadDocumentAsync(Item1.SelfLink, new RequestOptions { AccessCondition = ac });


public async Task DeleteItemAsync(string selfLink, string partitionKey)
        {
            await this._client.DeleteDocumentAsync(selfLink, new RequestOptions() { PartitionKey = new PartitionKey(partitionKey) });
        }

Одно решение: я могу подумать о создании собственной реализации класса ресурсов и документов и добавить все необходимые свойства.

затем проблема возникает, когда я получаю документ с новыми API-интерфейсами космоса, ссылка на себя не заполняется. Поскольку мой старый код сильно зависит от самоссылки, меня больше интересует решение, в котором можно получить все свойства, как это делается с DocumentDB.

Пожалуйста, отредактируйте свой вопрос и включите свой код.

Gaurav Mantri 07.11.2022 08:31

Добавлен пример кода...

Abhash786 07.11.2022 09:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У Document и Resource нет альтернативы. Однако вы можете легко создать собственный класс, который реализует свойства по умолчанию, такие как (например, public string id { get; set; }).

Я не знаю точной причины, но я думаю, что это частично потому, что v3 позволяет вам реализовать свой собственный сериализатор, который может привести к сбою универсального класса, такого как Resource, из-за зависимости от определенного сериализатора.

В качестве альтернативы accessCondition теперь вы должны использовать свойство IfMatchEtag или IfNoneMatchEtag. Например, вот upsert, который работает, только если etag совпадает:

await container.UpsertItemAsync(resource, pk, new ItemRequestOptions()
{
    IfMatchEtag = resource.ETag, //supply the etag yourself
});

Спасибо за ваш вклад... единственная проблема, с которой я сталкиваюсь при реализации ресурсов и документов, связана с самими свойствами. Поэтому, если я получаю документ с новыми API-интерфейсами космоса, ссылка на себя не заполняется. Поскольку мой старый код сильно зависит от самоссылки, меня больше интересует решение, в котором он может извлекать все свойства, как это делается с DocumentDB.

Abhash786 07.11.2022 10:57

обновленный вопрос с той же информацией

Abhash786 07.11.2022 11:02

Вы все еще можете заполнить selflink. Я только что попытался использовать [JsonProperty("_self")] public string Self { get; set; } с сериализатором по умолчанию. Хотя v3 теперь больше ориентирован на использование id и ключа раздела.

NotFound 07.11.2022 11:35

Позвольте мне попробовать это

Abhash786 07.11.2022 11:56
Ответ принят как подходящий

V3 использует Newtonsoft.Json в качестве механизма сериализации, вы можете иметь свой собственный базовый класс, который заменяет Resource и иметь системные свойства:

public class MyResource
{

[JsonProperty("id")] 
public string Id { get; set; }

[JsonProperty("_rid")] 
public string ResourceId { get; set; }

[JsonProperty("ttl")]
public int? TimeToLive { get; set; }

[JsonProperty("_self")] 
public string SelfLink { get; set; }

[JsonProperty("_ts")]
[JsonConverter(typeof(UnixDateTimeConverter))]
public virtual DateTime Timestamp { get; set; }

}

public class WorkPlay : MyResource
{
....
}

Другие вопросы по теме