编程语言
首页 > 编程语言> > c#-DocumentDB Upsert和Replace不会改变复杂的属性吗?

c#-DocumentDB Upsert和Replace不会改变复杂的属性吗?

作者:互联网

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

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

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中,如果我在上下文中更改“标志”,则ReplaceDocumentAsync(userProfile)或UpsertDocumentAsync(collectionUri,userProfile)都实际上似乎不会将更改持久化到数据库.

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

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

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

我已经尝试过使用“强”和“会话”一致性标志来解决这个问题,但是没有用.我觉得在类的定义中有一些东西阻止它正确地序列化到DocumentDB,但是我不确定那是什么.

任何想法欢迎:)

解决方法:

这是JSON.NET的奇怪序列化问题.
您要扩展的文档是一个动态对象(意味着您可以在运行时将新属性添加到对象中).
当混合Dyanmic和静态对象(例如Dictionary<>)时,JSON.NET具有处理序列化的有趣方式.

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

将您的班级更改为:
公共课个人资料:{…}

标签:azure,azure-cosmosdb,c
来源: https://codeday.me/bug/20191027/1943948.html