【发布时间】:2018-01-31 17:33:10
【问题描述】:
我有一个从 Cosmos DB 加载文档的方法。文档不是强类型,也不能是强类型。我想更新文档上的各种属性,然后将该文档推送回 CosmosDB。
我遇到的问题是我要更新的属性嵌套在另一个对象下面,我找不到有关如何向下导航到该子属性并更新它的文档。
这是我目前正在尝试做的事情。
var project = await Service.GetById(projectId) as Microsoft.Azure.Documents.Document;
var gate = project.GetPropertyValue<dynamic>("IdeaInitiatedGate");
project.SetPropertyValue("IdeaInitiatedGate.VpApprovalStatus", status);
project.SetPropertyValue("IdeaInitiatedGate.VpApprovalComments", comments);
project.SetPropertyValue("IdeaInitiatedGate.VpApprovalOn", DateTime.Now);
project.SetPropertyValue("IdeaInitiatedGate.Status", status == "Approved" ? "Completed" : "Rejected");
if (status == "Approved")
{
project.SetPropertyValue("CharterReview.Status", "Active");
}
var document = await Service.Replace(project);
Service 只是实际 CosmosDB 调用的包装器。上述代码发生的情况是,正在文档根目录下名为“IdeaInitiatedGate.VpApprovalStatus”的文档中创建新属性。我想要发生的是将 IdeaInitiatedGate 的 VpApprovalStatus 属性更新为新值。
想要更新这个
{
"IdeaInitiatedGate": {
"VpApprovalStatus": "Approved"
}
}
不要创建这个
{
"IdeaInitiatedGate.VpApprovalStatus": "Approved"
}
我最终得到的最终工作解决方案如下。基本上我使用 GetPropertyValue 来拉出我想要的动态根对象,然后我更改这个对象和整个动态对象的 SetProperty 值。
if (!(await Service.GetById(projectId) is Document project)) return null;
var gate = project.GetPropertyValue<dynamic>("IdeaInitiatedGate");
gate.VpApprovalStatus = status;
gate.VpApprovalComments = comments;
gate.VpApprovalOn = DateTime.Now;
gate.Status = status == "Approved" ? "Completed" : "Rejected";
project.SetPropertyValue("IdeaInitiatedGate", gate);
if (status == "Approved")
{
var charterGate = project.GetPropertyValue<dynamic>("CharterReview");
charterGate.Status = "Active";
project.SetPropertyValue("CharterReview", charterGate);
}
var result = await Service.Replace(project);
【问题讨论】:
-
如果
gate是dynamic类型,那么你不能直接使用动态API:gate.VpApprovalStatus = "Approved"吗?
标签: c# azure azure-cosmosdb