使用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
相关产品推荐
相关产品推荐

