我们为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#驱动程序的错误还是我缺少关于自定义序列化程序的东西?或者我的代码有问题吗?