使用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无法把赋值的属性值映射到正确的数据库字段。
解决步骤
- 修正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; } }
- 同步修正赋值代码里的属性名
确保你赋值的是正确的属性:
copy.GraduationYear = @class.GraduationYear;
- 更新数据库结构
如果数据库已经生成,需要同步更新:
- 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
相关产品推荐
相关产品推荐

