You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB C#反序列化POCO时EventReferenceEntry.Id属性恒为0问题求助

问题根因排查
  • 核心映射不匹配:MongoDB中i字段存储的是有符号NumberLong(对应BsonType.Int64),而你POCO中Id属性为无符号UInt64类型,C# MongoDB驱动默认不会自动完成两种类型的映射匹配,因此反序列化时会直接跳过该字段,导致Id始终为默认值0。你移除[BsonIgnoreExtraElements]后报错找不到i对应的属性,也是因为驱动认为类型不匹配,不认为你声明的Id属性对应i字段。
  • 部分条目无对应字段:你提供的数据库示例中_r数组的第二个元素本身就没有i字段,这类条目反序列化后Id默认就是0,属于正常情况。
解决方案

方案1(推荐):显式指定类型映射

在Id属性上添加[BsonRepresentation]特性,声明存储类型为Int64,驱动就会自动完成类型转换:

[BsonElement("i")]
[BsonRepresentation(BsonType.Int64)]
// 如果需要区分「无i字段」和「i值为0」的场景,可以改成可空类型 ulong?
public ulong Id { get; set; }

方案2:调整属性类型为匹配的有符号长整型

直接将Id属性类型改为和数据库NumberLong完全匹配的long,无需额外添加特性即可正常映射:

[BsonElement("i")]
public long Id { get; set; }

该方案兼容性更好,DateTime的Ticks本身就属于long的取值范围,不会出现溢出问题。

修改完成后,有i字段的条目就能正常读取到数值,不会再出现值为0的问题,移除[BsonIgnoreExtraElements]也不会再报i字段不匹配的错误。


内容的提问来源于stack exchange,提问作者Matthei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:39:00