文档数据库更新插入和替换不更改复杂属性

本文关键字:复杂 属性 替换 更新 插入 文档数据库 | 更新日期: 2023-09-27 18:33:44

使用 "Microsoft.Azure.DocumentDB": "1.5.2" 我在复杂对象正确持久化到数据库时遇到问题。它们的初始存储似乎正常,但是当仅对复杂结构的较深部分进行更改时,更新插入或替换似乎无法正确更新文档。

我有一个看起来像这样的对象(有些改变,削减版本(......

public class Profile : Document    {
        public Profile()
        {
            Id = Guid.NewGuid().ToString();
        }
        [JsonProperty(PropertyName = "userId")]
        public string UserId { get; set; }
        [JsonProperty(PropertyName = "defaultContext")]
        public Guid DefaultContext { get; set; }
        [JsonProperty(PropertyName = "contexts")]
        public Dictionary<Guid,UserContext> Contexts { get; set; }
    }
}

用户上下文看起来像这样...

public class UserContext
{
        [JsonProperty(PropertyName = "flag")]
        public Boolean Flag { get; set; }
        [JsonProperty(PropertyName = "stuff")]
        public List<String> Stuff { get; set; }
}

这个想法是配置文件可以有多个上下文,但有一个默认上下文。这让我可以说这样的话...

userProfile.Contexts[userprofile.DefaultContext].Flag = true;

问题是,假设其中一个存在于Azure DocumentDB中,如果我在上下文中更改"标志",则ReplaceDocumentAsync(userProfile(和UpsertDocumentAsync(collectionUri,userProfile(实际上似乎都不会保留对数据库的更改。

例如,在像这样的简单示例中...

userProfile.Contexts[userprofile.DefaultContext].Flag = true;    
var result = await Client.ReplaceDocumentAsync(userProfile);

我可以在调试器中查看用户配置文件,并看到标志设置为 true。然后,如果我查看结果,Flag 仍将为假(它是操作前数据库中的值(。

我已经尝试过使用"强"和"会话"一致性标志来尝试这样做,但无济于事。我觉得类的定义中有一些东西阻止它正确序列化到 DocumentDB,但我不确定这可能是什么。

任何想法都欢迎:)

眼界

文档数据库更新插入和替换不更改复杂属性

这是一个奇怪的序列化 JSON.NET 问题。您正在扩展的文档是一个动态对象(这意味着您可以在运行时向对象添加新属性等(。JSON.NET 在混合 Dyanmic 和静态对象(如字典(时有一种有趣的处理序列化的方法<>

解决此问题的最佳方法是不要从文档扩展并使用简单的 POCO。一旦你这样做,问题就会消失。

将课程更改为:公共类简介 : { ... }