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

