FindOneAndUpdateAsync不在MongoDB C#Driver中使用CustomSerilaizer

时间:2016-06-09 14:00:35

标签: c# mongodb serialization driver

我们为MongoDB编写了一个自定义序列化程序来序列化custom Id type。序列化程序将我们的自定义ID作为ObjectId写入Mongo,但在C#中将其表示为我们的自定义Id。这里的想法是我们可以有一些与数据库无关的域类(如果我们需要将它们存储在MongoDb之外的其他东西中)。

这适用于简单的插入或替换操作......但FindOneAndUpdateAsync操作似乎没有使用它。在$set字段上执行Id操作时,而不是将字段设置为ObjectId(如果我们使用自定义序列化程序,这是我期望的),ID会被写出来将Mongo DB作为文档...好像根本没有注册自定义序列化程序: - (

我有一些sample code on GitHub that reproduces the issue。如果在Line 37 in Program.cs添加断点,您将看到对Add(执行插入)的调用运行正常(如果您查看此时插入到测试数据库中的文档,您将会看到看到Id字段按预期序列化为ObjectId

{
    "_id" : ObjectId("57597589db14c50001d505ad"),
    "DateCreated" : ISODate("2016-06-09T13:56:25.088Z"),
    "DateUpdated" : ISODate("2016-06-09T13:56:25.088Z"),
    "SomeProp" : "Foo",
    "IdGuidProp" : "5eec7953-a819-4ce9-8b26-21d86aae1c93",
    "IdProp" : ObjectId("57597589db14c50001d505ae")
}

然而,下一行(#38)爆炸......主要是因为它无法对更新产生的文档进行反序列化(FindOneAndUpdateOptions包括ReturnDocument = ReturnDocument.After)。如果此时检查MongoDB中的文档,您可以看到在FindOneAndUpdateAsync操作期间未使用自定义序列化程序:

{
    "_id" : ObjectId("57597589db14c50001d505ad"),
    "DateCreated" : ISODate("2016-06-09T13:56:25.088Z"),
    "DateUpdated" : ISODate("2016-06-09T13:56:25.088Z"),
    "SomeProp" : "Bar",
    "IdGuidProp" : {
        "_t" : "Core.IdGuid, Core",
        "_v" : "53062519-4cbf-4464-b972-c7bc6bc7a72d"
    },
    "IdProp" : {
        "_t" : "Core.Id, Core",
        "_v" : ObjectId("57597589db14c50001d505af")
    }
}

这是C#驱动程序的错误还是我缺少关于自定义序列化程序的东西?或者我的代码有问题吗?

0 个答案:

没有答案