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

时间:2016-02-09 07:51:10

标签: c# azure azure-cosmosdb

使用“Microsoft.Azure.DocumentDB”:“1.5.2”我遇到了正确持久存储到数据库的复杂对象的问题。它们的初始存储似乎没问题,但是当仅对复杂结构的较深部分进行更改时,Upsert或Replace似乎无法正确更新Document。

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

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; }
    }
}

UserContext看起来像这样......

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中,如果我在上下文中更改“flag”,则ReplaceDocumentAsync(userProfile)和UpsertDocumentAsync(collectionUri,userProfile)实际上似乎都不会对数据库进行更改。< / p>

例如,像这样的简单例子......

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

我可以在调试器中查看userProfile,看看Flag是否设置为true。然后,如果我查看结果,Flag仍将为false(操作前它在DB中的值)。

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

欢迎任何想法:)

1 个答案:

答案 0 :(得分:4)

这是JSON.NET的一个奇怪的序列化问题。 您正在扩展的Document是一个Dynamic对象(意味着您可以在运行时向对象添加新属性等)。 在混合Dyanmic和静态对象(如Dictionary&lt;&gt;

)时,JSON.NET有一种处理序列化的有趣方法

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

将您的班级更改为: 公共课简介:{...}