Поскольку пакет 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
Но похоже, что все классы и функции доступны в новом пакете.
Для классов ниже я не смог найти замену...
Моя кодовая база сильно зависит от свойств, поставляемых с такими классами, как 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.
Добавлен пример кода...
У 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.
обновленный вопрос с той же информацией
Вы все еще можете заполнить selflink. Я только что попытался использовать [JsonProperty("_self")] public string Self { get; set; }
с сериализатором по умолчанию. Хотя v3 теперь больше ориентирован на использование id
и ключа раздела.
Позвольте мне попробовать это
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
{
....
}
Пожалуйста, отредактируйте свой вопрос и включите свой код.