c# - 如何使 Update.Set 遵循我的 DateTime 序列化选项?

标签 c# mongodb

我正在使用 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/

相关文章:

c# - 从强类型 Razor View 使用 Html.BeginForm 传递值

c# - 使用 DI 和 UoW 模式时是否需要使用 EF 语句

c# - 字符串到日期时间 "hh:mm:ss"或 "dd.mm.yyyy hh:mm:ss"格式

mongodb - 运行 mongodb --repair 数据库为空后

javascript - 将额外变量传递给回调函数

c# - 在 Awesomium 中打印到打印机?

c# - 实时图形绘制(波形)

javascript - 如何在 MongoDB 和 Meteor 中自动销毁 1-M 连接

mongodb - 在 $lookup 之后获取值作为元素数组

javascript - 实例化导出类的属性时出错