DocumentDB ReplaceDocument不会保存提交的子文档

时间:2015-10-18 19:27:19

标签: azure asp.net-web-api azure-cosmosdb

问题是:当我发送整个文档并在控制器中更改该文档时,它会被替换为罚款。 但是,当我提交subDocument和文档的ID时,通过id获取文档并将子文档添加到它,它将不会用新的文档替换原始文档。

无法正常工作的控制器功能

    [HttpPut]
    public async Task<IHttpActionResult> Put(string id, [FromBody]DealMutationModel mutation)
    {
        if (ModelState.IsValid)
        {
            mutation.CreatedAt = DateTime.UtcNow;

            DealModel Deal = DealRepo.Get(x => x.Id == id).FirstOrDefault();

            List<DealMutationModel> mutationList = Deal.Mutations.ToList();
            DealMutationModel newMutation = mutation;
            mutationList.Add(newMutation);
            Deal.Mutations = mutationList;

            await DealRepo.UpdateDealAsync(Deal);

            return Ok();

        }

        return BadRequest(ModelState);
    }

更新功能。

    public static async Task<Document> UpdateDealAsync(DealModel deal)
    {
        var result =  await DocumentDB.Client.ReplaceDocumentAsync(deal);
        return result;
    }

并且功能正常。

    [HttpPut]
    public async Task<IHttpActionResult> Put(string id, [FromBody]DealModel deal)
    {
        if (ModelState.IsValid)
        {
            DealMutationModel mutation = new DealMutationModel
            {
                UserId = CurrentUser.Id,
                Status = "matched",
                CreatedAt = DateTime.UtcNow,
                Note = "Deal made"
            };
            deal.Mutations = new List<DealMutationModel> { mutation };

            await DealRepo.UpdateDealAsync(deal);

            return Ok();
        }

        return BadRequest(ModelState);
    }

唯一有效的差异是发送整个文档而不是仅发送突变。 有人可以赐教我原因吗?或者向我解释一下如何发送突变,因为我希望尽可能少地发送数据。

除了问题 在第一个代码块中,您可以看到一些奇怪的方法来将突变添加到交易中。不知何故直接:Deal.Mutations.ToList()。添加(变异);不行。 也许这与问题有关?

回复Aravind 不能分享整个模型,但下面是顶部的部分。 交易模型源自Document,而变异模型则不是,因为它是交易的一部分。

using Microsoft.Azure.Documents;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace BC.UI.Web.Models
{
    public class DealModel : Document
    {
       [Required]
       [JsonProperty(PropertyName = "createdAt")]
       public DateTime CreatedAt { get; set; }
       ......
    }

    public class DealMutationModel
    {
       [JsonProperty(PropertyName = "status")]
       public string Status{ get; set; }
       ......
    }
}

解决方法和SDK 我们使用的DocDB版本是1.4.1,看到1.5.0已经出来所以我将进行升级和测试。 目前,解决方法是创建一个动态并填写交易,使用命令获取突变并将其应用于新的mutationModel并将突变添加到交易中。

[HttpPut]
public async Task<IHttpActionResult> Put(string id, [FromBody]MutationCommand mutationCommand)
{
    dynamic dyn = DocumentDB.Client.CreateDocumentQuery<Document>(DocumentDB.DealCollection.DocumentsLink).Where(d => d.Id == id).AsEnumerable().FirstOrDefault();
    var deal = (DealModel)dyn;
.....

提前致谢, 卡雷尔

0 个答案:

没有答案