最大序列化深度超过

时间:2018-04-30 12:23:51

标签: c# mongodb atlas

在尝试在MongoDB上推送新数据时,我收到错误“超出最大序列化深度”。使用MongoDB社区对localhost进行单元测试时,它没有问题。任何帮助,将不胜感激。我也没有看到循环参考。

这是启动数据保存的功能。首先是我的本地缓存然后是云(MongoDB)。

///Calling function
public async Task AddComment(Range item, Comment commentItem)
{
    try
    {
        //Save to local cache
        item.Comments.Add(commentItem);

        //Next save to cloud
        await CloudStorage.AddComment(item.User.ID, item.ID, commentItem);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
    }
}

//-->ERROR HAPPENS LAST LINE HERE<--
public async Task<UpdateResult> AddComment(string ownerID, string rangeID, Comment comment)
{
    var filter = Builders<User>.Filter.Where(u => u.ID == ownerID &&
                                                  u.Content.Any(i => i.ID == rangeID));
    var update = Builders<User>.Update.Push(c => c.Content[-1].Comments, comment);
    return await collection.UpdateOneAsync(filter, update); //<- THIS THROWS ERROR
}

这是与localhost一起使用的单元测试。

[TestMethod]
public void TestInsertComment()
{
    //Arrange
    var owner = "OWNER";

    var ownerData = collection.Find(u => u.Username.Equals(owner)).FirstOrDefault();
    var ownerID = ownerData?.ID;
    var range = ownerData?.Content.FirstOrDefault();

    var newComment = new Comment
    {
        User = range?.User,
        Content = "Some comment",
        IsLive = true
    };

    //Act
    var results = _cloudStorageService.AddComment(ownerID, range?.ID, newComment);
    results.Wait();

    var insertedID = collection.Find(u => u.Username.Equals(owner))
                               .FirstOrDefault().Content.FirstOrDefault()?
                               .Comments.FirstOrDefault(c => c.ID.Equals(newComment.ID))?.ID;

    //Assert
    Assert.AreEqual(newComment.ID, insertedID);
}

更新:我注意到的一件事是,如果同一个用户尝试在其范围内添加评论,则这是此错误发生的唯一时间。如果其他用户添加评论,它就可以正常工作。无论是用户还是其他用户,单元测试都能正常运行。

1 个答案:

答案 0 :(得分:0)

哇!

所以我决定放弃我遇到的错误并执行代码清理。在这样做的过程中,我偶然发现了一个我一直忽略的清理项目,即从代码中删除所有SomeAsyncTask.Wait()引用并替换为等待SomeAsyncTask。好吧,这样做,我发现了这个小金块:

var commentItem = new Comment
{
    User = GetCurrentUserExtData(),
    Content = NewCommentText
}

public User GetCurrentUserExtData(string ID = null)
{
    var user = new User();
    var data = DataStore.GetUser(ID);
    data.Wait();
    user = data.Result;

    return user;
}

GetCurrentUserExtData中包含SomeAsyncTask.Wait()任务。将其更改为:

var commentItem = new Comment
{
    Content = NewCommentText,
    User = await DataStore.GetUser()
}

没有更多的最大序列化深度超出错误!我完全没有想到会有什么相关但却是!不用说,删除所有.WAIT()参考并找到一种方法来使用等待,如果使用异步方法。