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

