C# .NET7 Blazor Server中MongoDB.Driver存储对象列表报错求助
问题解决:MongoDB反序列化List错误
问题根源
数据库中allUser文档的Transcript字段是文档类型({}),但代码中AllUser类的Transcript属性定义为List<Transcript>,类型不匹配直接导致反序列化失败。
解决方案
1. 修复现有数据库数据
使用MongoDB Shell执行以下命令,将所有allUser文档的Transcript字段从空文档改为空数组:
db.allUser.updateMany( { "Transcript": {} }, { $set: { "Transcript": [] } } )
2. 优化实体类定义
修改AllUser.cs中的Transcript属性,添加默认值并增强序列化兼容性:
[BsonElement("Transcript")] // 兼容可能遗留的空文档或null值 [BsonSerializer(typeof(NullableSerializer<List<Transcript>>))] public List<Transcript> Transcript { get; set; } = new List<Transcript>();
确保属性默认是空数组,序列化时始终以数组类型存储到MongoDB。
3. 修正业务逻辑错误
原function.razor存在索引越界风险(counter随课程循环递增,可能超出用户列表长度),且可能重复添加记录,修改后的代码如下:
@page "/function" <button @onclick="runFunction">run function</button> @code { Mongo mongo = new Mongo("database"); private void runFunction() { var queryClasses = mongo.LoadRecord<Classes>("classes"); var queryUser = mongo.LoadRecord<AllUser>("allUser"); Console.WriteLine("running function"); // 遍历所有教师用户 foreach (var user in queryUser.Where(u => u.AccountType == "Faculty")) { // 找到该教师对应的所有课程 var professorCourses = queryClasses.Where(c => c.ProfFirstName == user.FirstName && c.ProfLastName == user.LastName); foreach (var course in professorCourses) { // 避免重复添加相同CRN的成绩单 if (!user.Transcript.Any(t => t.CRN == course.CRN)) { var transcriptToAdd = new Transcript { Building = course.BuildingID, CourseName = course.CourseName, CourseID = course.CourseID, Credits = course.Credits, CRN = course.CRN, EndDate = course.EndDate, Grade = "C", RoomID = course.RoomID, Semester = course.Semester, StartDate = course.StartDate }; user.Transcript.Add(transcriptToAdd); mongo.UpsertRecord<AllUser>("allUser", user.Id, user); } } } Console.WriteLine("table updated"); } }
4. 验证效果
- 新增用户时,
Transcript字段默认存储为空数组[] - 查询用户列表时,不再出现反序列化错误
- 执行
runFunction后,教师用户的Transcript字段会正确添加对应课程的记录
内容的提问来源于stack exchange,提问作者匿名
相关产品推荐
相关产品推荐

