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

C# MongoDB一对多关联存储时ObjectId类型转换错误如何解决

报错原因
  • 核心原因是JSON反序列化阶段无法自动将Postman传入的字符串格式的ObjectId值,转换为C#类中定义的MongoDB.Bson.ObjectId类型:你在请求参数里传的authorsId数组元素是字符串类型,而Book类的AuthorsId属性是List<ObjectId>类型,默认的JSON序列化器没有配置对应类型转换规则,触发转换失败报错。
  • 次要注意点:你粘贴的Postman请求JSON缺少末尾的闭合},实际请求如果存在该问题也会触发语法错误。另外Book类中DatePublication属性对应的[BsonElement]配置写为了DatePublicacion(拼写少了字母t),会导致后续存入数据库的字段名和预期不符。
解决方案

方案1(最简便,推荐):修改属性定义适配字符串传入

将AuthorsId属性的类型改为List<string>,并添加[BsonRepresentation]特性,让MongoDB驱动自动完成字符串和Bson ObjectId类型的转换,无需额外配置序列化规则:

[BsonElement("AuthorsId")]
[BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)]
public List<string> AuthorsId{ get; set; }

修改后直接接收前端传入的字符串格式ObjectId即可,存入数据库时会自动转换为标准ObjectId类型,查询时也会自动转回字符串返回。

方案2:保留List<ObjectId>类型,配置JSON序列化转换器

如果业务需要保留ObjectId类型的属性定义,可给项目的JSON序列化器添加ObjectId转换规则:
如果使用ASP.NET Core默认的System.Text.Json,可在Program.cs中添加自定义转换器:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new ObjectIdJsonConverter());
    });

如果使用Newtonsoft.Json,可安装MongoDB.Bson包对应的Newtonsoft序列化扩展,配置对应转换器即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:54:07