ASP.NET按钮点击从MongoDB取数报错:无法反序列化ObjectId为Null求助
解决ASP.NET中MongoDB反序列化ObjectId为Null的错误
我来帮你搞定这个问题!首先咱们得理清错误根源:Cannot deserialize a 'ObjectId' from BsonType 'Null' 是说MongoDB驱动在把文档转成userinfo对象时,碰到了值为Null的_id字段,但驱动默认认定_id得是有效的ObjectId类型——哪怕你注释掉了实体类里的_id属性,驱动还是会自动处理集合中文档的_id字段,这就是问题的核心。
下面是具体的解决步骤:
1. 修正实体类的_id映射
你有两种方式处理这个问题:
- 把
_id改成可空类型,允许它为null:
public class userinfo { public ObjectId? _id { get; set; } // 改为可空的ObjectId类型 public string name { get; set; } public string emailid { get; set; } public string password { get; set; } public string phoneno { get; set; } public string activate { get; set; } public string block { get; set; } }
- 或者用
[BsonIgnoreIfNull]特性,告诉驱动当_id为null时直接忽略它:
using MongoDB.Bson.Serialization.Attributes; // 需要引入这个命名空间 public class userinfo { [BsonIgnoreIfNull] public ObjectId _id { get; set; } public string name { get; set; } public string emailid { get; set; } public string password { get; set; } public string phoneno { get; set; } public string activate { get; set; } public string block { get; set; } }
2. 检查并修复MongoDB集合中的异常文档
MongoDB默认会给每个插入的文档自动生成有效的ObjectId作为_id,如果你的集合里存在_id为null的文档,这属于不规范数据。建议登录MongoDB客户端执行以下命令排查修复:
// 查看集合中_id为null的文档 db.userinfo.find({_id: null}) // 如果存在这类文档,更新它们的_id为有效的ObjectId db.userinfo.updateMany({_id: null}, {$set: {_id: ObjectId()}})
3. 优化异步代码(可选但推荐)
你现在用ToListAsync().Result的方式很容易导致ASP.NET应用死锁,建议换成async/await模式:
protected async void Button1_Click(object sender, EventArgs e) { // 方法标记为async String connectionstring = "mongodb://localhost"; var client = new MongoClient(connectionstring); var database = client.GetDatabase("SIH"); bool isMongoLive = await database.RunCommandAsync((Command<BsonDocument>)"{ping:1}").WaitAsync(TimeSpan.FromMilliseconds(1000)); if (isMongoLive) { var collection = database.GetCollection<userinfo>("userinfo"); var idd = TextBox1.Text; var userinfo = await collection.Find(b => b.name == idd).ToListAsync(); // 使用await替代.Result foreach (var user in userinfo) { Response.Write(user.phoneno); } } else { Response.Write("Hello dude your server is not connected !! "); } }
做完这些步骤,你应该就能正常通过用户名从MongoDB获取数据了。
内容的提问来源于stack exchange,提问作者AMIT MISHRA
相关产品推荐
相关产品推荐

