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

MongoDB .NET绑定模型类时无法读取Integer类型id值的问题

问题描述

MongoDB中存在一个名为transaction的集合,文档结构如下:

{
    "approverSpv": {
        "id": 176,
        "isApproved": true
    },
    "approverManager": {
        "id": 176,
        "isApproved": true
    }
}

为读取审批人id字段,创建了对应的C#模型类:

public class ApproverManager
{
    public int id { get; set; }

    public bool isApproved { get; set; }
}


public class ApproverSpv
{
    public int id { get; set; }

    public bool isApproved { get; set; }
}

public class Transaction 
{
     public ApproverSpv approverSpv { get; set; }
     
     public ApproverManager approverManager { get; set; }
}

使用以下代码查询数据:

var transactionParts = database.GetCollection<Transaction>("transaction").AsQueryable<Transaction>().ToList();

查询结果中isApproved能正确获取值,但ApproverSpv和ApproverManager中的id始终为0,如何解决?

解决方案

问题根源是MongoDB .NET驱动的默认序列化规则:驱动会将C#类中的id属性默认识别为MongoDB的主键_id,而非文档中的普通id字段,导致映射失败。

有两种可行的解决方式:

方法一:使用[BsonElement]特性指定字段映射

在模型类的id属性上添加特性,明确指定要映射的MongoDB字段名:

using MongoDB.Bson.Serialization.Attributes;

public class ApproverManager
{
    [BsonElement("id")]
    public int id { get; set; }

    public bool isApproved { get; set; }
}

public class ApproverSpv
{
    [BsonElement("id")]
    public int id { get; set; }

    public bool isApproved { get; set; }
}

public class Transaction 
{
     public ApproverSpv approverSpv { get; set; }
     
     public ApproverManager approverManager { get; set; }
}

方法二:全局配置驱动的字段映射规则

如果不想逐个添加特性,可以在程序启动时全局配置驱动的命名策略,并单独修正id字段的映射逻辑:

using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Conventions;

// 全局配置驼峰命名映射
var conventionPack = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", conventionPack, t => true);

// 单独配置ApproverSpv和ApproverManager的id字段
BsonClassMap.RegisterClassMap<ApproverSpv>(cm =>
{
    cm.AutoMap();
    cm.MapField(c => c.id).SetElementName("id");
});

BsonClassMap.RegisterClassMap<ApproverManager>(cm =>
{
    cm.AutoMap();
    cm.MapField(c => c.id).SetElementName("id");
});

两种方式都能让驱动正确将MongoDB文档中的id字段映射到C#模型的id属性,获取到实际的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:12:48