C# DocumentDB Upsert和Replace不改变复杂属性?

C# DocumentDB Upsert和Replace不改变复杂属性?,c#,azure,azure-cosmosdb,C#,Azure,Azure Cosmosdb,使用“Microsoft.Azure.DocumentDB”:“1.5.2”时,我在将复杂对象正确持久化到数据库时遇到问题。它们的初始存储似乎正常,但当复杂结构的深层部分发生更改时,Upsert或Replace似乎无法正确更新文档 我有一个看起来像这样的对象(有些改动,精简版) 问题是,假设其中一个存在于Azure DocumentDB中,如果我在上下文中更改“标志”,则ReplaceDocumentSync(userProfile)和UpsertDocumentSync(collectionU

使用“Microsoft.Azure.DocumentDB”:“1.5.2”时,我在将复杂对象正确持久化到数据库时遇到问题。它们的初始存储似乎正常,但当复杂结构的深层部分发生更改时,Upsert或Replace似乎无法正确更新文档

我有一个看起来像这样的对象(有些改动,精简版)

问题是,假设其中一个存在于Azure DocumentDB中,如果我在上下文中更改“标志”,则ReplaceDocumentSync(userProfile)和UpsertDocumentSync(collectionUri,userProfile)实际上似乎都不会将更改持久化到数据库中

例如,在这样一个简单的例子中

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;    
var result = await Client.ReplaceDocumentAsync(userProfile);
我可以在调试器中查看userProfile,并看到该标志设置为true。然后,若我查看结果,标志仍然是false(它在操作前的DB中的值)

我尝试过使用“强”和“会话”一致性标志,但没有效果。我觉得类的定义中有某种东西阻止它正确序列化到DocumentDB,但我不确定这可能是什么

有什么想法欢迎:)


Ken

这是JSON.NET的一个奇怪的序列化问题。 文档,您要扩展的是一个动态对象(这意味着您可以在运行时向对象添加新属性以及其他内容)。 当混合动态对象和静态对象(如Dictionary)时,JSON.NET有一种有趣的处理序列化的方法

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

将您的班级改为:
公共类配置文件:{…}

PS。您不需要设置Id=Guid.NewGuid(),如果您不自己设置Id,SDK将执行此操作。@RyanCrawCour MSFT-谢谢您的提示!我自己设置Id,以便在创建新对象时可以预测插入之前会发生什么,但我会记住它。谢谢@Ryan,最后一切都很顺利。显然,我不得不对我的数据层做一些修改,但我已经做好了一切准备。我将配置文件更新为普通对象,然后在需要时进行转换,因为它不再是文档的超集。例子。。。var tmp=wait Client.UpsertDocumentAsync(uri,文档);概要文件结果=(动态)tmp.Resource;这似乎行得通。
userProfile.Contexts[userprofile.DefaultContext].Flag = true;
userProfile.Contexts[userprofile.DefaultContext].Flag = true;    
var result = await Client.ReplaceDocumentAsync(userProfile);