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

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,提问作者匿名

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:45:05