gpt4 book ai didi

c# - 如何让 Update.Set 尊重我的 DateTime 序列化选项?

转载 作者:可可西里 更新时间:2023-11-01 10:07:55 25 4
gpt4 key购买 nike

我正在使用 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);
});

当 Review 是嵌入文档并与其父文档一起保存时,这可以正常工作。但是现在我正在尝试更新特定的评论,它涉及一些像这样的手动编码(魔术字符串,呃):

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: TimeOfDay component for DateOnly DateTime value is not zero]

我该如何解决这个问题?

最佳答案

哇。这是困难的一个。我将不得不考虑一些如何最好地解决这个问题。 Bryan 的回答是正确的,序列化选项仅在序列化整个类时使用。但他最后建议在 DateTime 上调用 RegisterClassMap 是不正确的。

但我可以为您提供解决方法。您获得异常的原因是您使用的 DateTime 可能是您本地时区的午夜,但它正在转换为 UTC 以存储在数据库中。这就是非零时间分量的来源。

您可以使用以下方式禁止转换为 UTC:

.Set("Reviews.$.Date", DateTime.SpecifyKind(review.Date, DateTimeKind.Utc))

这应该有效,但如果无效请告诉我,我会进一步调查。

关于c# - 如何让 Update.Set 尊重我的 DateTime 序列化选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5232955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com