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

使用ClassMap时MongoDB报错:''不是有效的24位十六进制字符串

问题分析与解决方案

你的ClassMap配置缺少了Id自动生成器的设置,这就是导致报错的核心原因。

当使用[BsonRepresentation(BsonType.ObjectId)]属性时,MongoDB驱动会默认启用StringObjectIdGenerator——这个生成器会在Id为空字符串时,自动生成一个新的ObjectId并转换为十六进制字符串。但直接用SetSerializer只指定了序列化规则,没有配置自动生成逻辑,驱动会把空字符串当作要存储的Id值,自然触发格式错误。

修正后的ClassMap配置

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 更多初始化代码...

        BsonClassMap.RegisterClassMap<MyEntity>(cm =>
        {
            cm.AutoMap();
            // 配置Id生成器:为空时自动生成ObjectId
            cm.IdMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance);
            // 指定序列化规则:将ObjectId与string互转
            cm.IdMemberMap.SetSerializer(new StringSerializer(BsonType.ObjectId));
        });
    }
}

补充说明

  • StringObjectIdGenerator专门处理string类型的Id字段,会在插入文档且Id为空时自动生成合法的ObjectId字符串。
  • 如果你不需要手动设置序列化器,也可以用SetRepresentation方法替代,效果和[BsonRepresentation]一致:
    cm.IdMemberMap.SetRepresentation(BsonType.ObjectId);
    
    这种写法更简洁,驱动会自动匹配对应的序列化器和生成器。

内容的提问来源于stack exchange,提问作者Rogier van het Schip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:20:45