CosmosDB SQL Api 不保留枚举值 0

CosmosDB SQL Api not persisting Enum values 0

问题:

我正在开发一个 .NET Core 5.0 Web 应用程序,它使用 Cosmos DB 作为我的持久性存储,当枚举设置为 0(默认值)时,它似乎不会持久化枚举。在下面的代码中,当我创建会话时,默认的 SessionStatus 值为 Planned。如果我将会话设置为进行中或已完成。它在数据库中显示的值分别为 1 或 2。

我的代码 会话 Class

public class Session
{
    [JsonProperty("creator_id")]
    public string CreatorId { get; private set; }

    [JsonProperty("session_status")]
    public SessionStatus SessionStatus { get; private set; }
}
public enum SessionStatus
{
    Planned,
    InProgress,
    Completed
}

回购:

var document = await cosmosDbClient.CreateDocumentAsync(session);

Cosmos 客户端:

public async Task<Document> CreateDocumentAsync(object document, RequestOptions options = null,
    bool disableAutomaticIdGeneration = false, CancellationToken cancellationToken = default(CancellationToken))
{
    return await _documentClient.CreateDocumentAsync(
        UriFactory.CreateDocumentCollectionUri(_databaseName, _collectionName), document, options,
        disableAutomaticIdGeneration, cancellationToken);
}

我试过的:

  1. 我尝试设置枚举 json 在枚举对象上转换为在数据库中存储为字符串,但在数据库中 session_status 的行为相同。
  2. 我可以将 SessionStatus 的默认值设置为 1 作为解决方法,但我更愿意了解底层问题。

似乎使用的底层 JSON 序列化程序设置为忽略默认值。在创建 cosmos 数据库的客户端时,可以在选项中指定行为,但也可以使用 JSON 注释将范围限定为单个参数。

Cosmos v2 和 v3 默认使用序列化程序包 Newtonsoft.Json,您可以在其中对单个参数使用 [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)] 以始终写入它。

Cosmos v4 默认使用 System.Text.Json,您可以使用 [JsonIgnore(Condition = JsonIgnoreCondition.Never)].

执行相同的操作

不包括它的原因是读取和写入 CosmosDB 的默认值会消耗一些额外的 RU 并且可能不需要,因为在使用class 型号。