问题是:当我发送整个文档并在控制器中更改该文档时,它会被替换为罚款。 但是,当我提交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;
.....
提前致谢, 卡雷尔