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

使用Entity Framework导入JSON数据时Pupil的GraduationYear字段未写入数据库

问题根源:属性名拼写错误!

嘿,我一眼就揪出问题所在了——你的Pupil实体类里的毕业年份属性拼写错了!

看你贴的实体类代码:

public class Pupil {
    // ...其他属性
    public string GradutaionYear { get; set; } // 注意这里少了一个字母'g'!正确写法是GraduationYear
    // ...其他属性
}

你在代码里赋值的是copy.GradutaionYear = @class.GraduationYear;,虽然调试时你觉得updatedPupils里的GraduationYear值正确,但实际上你赋值的是那个拼写错误的属性。这就导致:

  • 如果是Code First模式,EF会根据错误的属性名生成GradutaionYear字段,但你查看的是数据库里本该存在的GraduationYear字段,自然看到null;
  • 如果是Database First模式,实体类的属性名和数据库字段名不匹配,EF无法把赋值的属性值映射到正确的数据库字段。
解决步骤
  1. 修正Pupil实体类的属性名
    把拼写错误的GradutaionYear改成正确的GraduationYear:
public class Pupil {
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Photo { get; set; }
    public string GraduationYear { get; set; } // 修正拼写
    public string Description { get; set; }
    public Class Class { get; set; }
}
  1. 同步修正赋值代码里的属性名
    确保你赋值的是正确的属性:
copy.GraduationYear = @class.GraduationYear;
  1. 更新数据库结构
    如果数据库已经生成,需要同步更新:
  • Code First:运行Add-Migration FixPupilGraduationYearSpelling生成迁移,再执行Update-Database更新数据库;
  • Database First:确保实体类属性名和数据库里的字段名完全一致。
额外优化小建议

另外,你的导入代码可以优化下,减少数据库操作次数——别在循环里每次都调用SaveChanges(),可以把所有实体添加完后一次性保存,性能会好很多:

if (!_context.Classes.Any()) {
    var classes = JsonConvert.DeserializeObject<List<Class>>(await File.ReadAllTextAsync("PATH\\data.json"));
    
    // 先批量添加所有Class
    foreach (var @class in classes) {
        await _classRepository.AddClass(@class);
    }
    await _classRepository.SaveChanges(); // 一次性保存

    var updatedPupils = new List<Pupil>();
    foreach (var @class in classes) {
        foreach (var pupil in @class.Pupils) {
            var copy = pupil;
            copy.GraduationYear = @class.GraduationYear;
            updatedPupils.Add(copy);
        }
    }

    // 再批量添加所有Pupil
    foreach (var pupil in updatedPupils) {
        await _pupilRepository.AddPupil(pupil);
    }
    await _pupilRepository.SaveChanges(); // 一次性保存
}

这样既提升了导入速度,也避免了频繁连接数据库的开销~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:35:18