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

升级MongoDB C# Driver至2.19.2触发InvalidCastException异常求助

解决方案

1. 显式注册枚举序列化器

MongoDB C# Driver 2.19+的LINQ3实现对枚举序列化的校验更严格,需确保枚举类型被正确绑定对应的序列化器。可在客户端初始化时全局配置:

var settings = MongoClientSettings.FromConnectionString("你的数据库连接字符串");
settings.SerializerRegistry = BsonSerializerRegistry.Create(new BsonSerializerSettings
{
    Serializers = { new EnumSerializer<Vehicle>(BsonType.Int32) }
});
var client = new MongoClient(settings);

也可直接在枚举类型上标记特性:

[BsonSerializer(typeof(EnumSerializer<Vehicle>))]
public enum Vehicle
{
    // 枚举成员定义
}

2. 调整投影中的转换逻辑

避免在LINQ查询的投影阶段直接强制转换,改用先提取底层值再转换为枚举的方式,绕过LINQ3的序列化器类型检查:

Car = (Vehicle)Convert.ToInt32(project.Car)

或者使用枚举解析方法:

Car = Enum.Parse<Vehicle>(project.Car.ToString())

3. 临时关闭LINQ3模式(适配过渡用)

若升级后默认启用的LINQ3模式导致兼容问题,可在查询时临时关闭(不推荐长期依赖,建议最终适配LINQ3):

var query = collection.AsQueryable(new AggregateOptions { UseLinq3 = false })
    .Select(project => new {
        Car = (Vehicle)project.Car
    });

4. 校验数据库存储类型与枚举底层类型一致性

检查数据库中Car字段的存储类型是否为int32,若实际存储为字符串或其他类型,需同步调整枚举的序列化配置,比如存储为字符串时:

[BsonSerializer(typeof(EnumSerializer<Vehicle>, BsonType.String))]
public enum Vehicle
{
    // 枚举成员定义
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:22:39