我正在使用 mongoDB 的官方 10gen C# 驱动程序。我有一些设置 BSON 映射的代码,它在应用程序启动时运行一次:
BsonClassMap.RegisterClassMap<Review>(cm =>
{
cm.AutoMap();
cm.MapProperty(c => c.Date)
.SetSerializationOptions(new DateTimeSerializationOptions{DateOnly = true});
cm.UnmapProperty(c => c.Author);
});
当评论是嵌入文档并与其父文档一起保存时,此方法可以正常工作。然而现在我正在尝试更新一个特定的评论,它涉及一些手动编码,如下所示(魔术字符串,呃):
collection.Update(query,
Update.Set("Reviews.$.Date", review.Date)
.Set("Reviews.$.Rating", review.Rating)
.Set("Reviews.$.Title", review.Title)
.Set("Reviews.$.Comment", review.Comment)
);
这也有效...但它不遵守 Review 类上 DateTime 的序列化设置,并且显然也保存了时间部分(即使是午夜,因为 review.Date ==日期时间.今天
)。然后,当我尝试检索该文档时,出现异常:[FileFormatException: DateOnly DateTime 值的 TimeOfDay 组件不为零]
。
如何解决这个问题?
最佳答案
哇。这是困难的一个。我得想想如何最好地解决这个问题。布莱恩的答案是正确的,序列化选项仅在序列化整个类时使用。但他最后建议在 DateTime 上调用 RegisterClassMap 是不正确的。
但我可以为您提供一个解决方法。您收到异常的原因是您使用的 DateTime 可能是您本地时区的午夜,但它正在转换为 UTC 以存储在数据库中。这就是非零时间分量的来源。
您可以使用以下方法禁止转换为 UTC:
.Set("评论.$.Date", DateTime.SpecifyKind(review.Date, DateTimeKind.Utc))
这应该可行,但如果不行请告诉我,我会进一步调查。
关于c# - 如何使 Update.Set 遵循我的 DateTime 序列化选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5232955/