我想使用Entity Framework将数据从JSON文件导出到SQL数据库。我是这样做的:
// If database is empty, seed data
if (!_context.Classes.Any())
{
var classes = JsonConvert.DeserializeObject<List<Class>>(await File.ReadAllTextAsync("PATH\\data.json"));
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.GradutaionYear = @class.GraduationYear;
updatedPupils.Add(copy);
}
}
foreach (var pupil in updatedPupils)
{
await _pupilRepository.AddPupil(pupil);
await _pupilRepository.SaveChanges();
}
}
在这个方法中,我通过从名为GraduationYear
的字段中复制类实体中的值来更新名为GraduationYear
的 pupil 字段。但是在此操作之后,GraduationYear
字段尚未在数据库中更新,它仍为空。
我该如何解决?
修改的
在检入调试器后,我确信有一件事,updatedPupils
列表中的实体在GraduationYear
字段中具有正确的值。
课程代码
public class Class
{
public Guid Id { get; set; }
public ICollection<Pupil> Pupils { get; set; }
public string SchoolName { get; set; }
public string ClassName { get; set; }
public string ClassProfile { get; set; }
public string GraduationYear { get; set; }
public string ClassPhoto { get; set; }
public string Description { get; set; }
}
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 GradutaionYear { get; set; }
public string Description { get; set; }
public Class Class { get; set; }
}
编辑2
public async Task<Pupil> AddPupil(Pupil entity)
{
var result = await _context.Pupils.AddAsync(entity);
return result.Entity;
}
答案 0 :(得分:0)
首先,看看这段代码:
var copy = pupil;
copy.GradutaionYear = @class.GraduationYear;
updatedPupils.Add(copy);
在c#中,等于=
的符号复制变量但保留对原始变量的引用,因此当您执行copy.GradutaionYear = @class.GraduationYear
时,您更新了GradutaionYear
的{{1}}属性和copy
vars。
因此,此代码pupil
与执行var copy = pupil; copy.GradutaionYear = @class.GraduationYear;
相同。
其次,在循环中执行pupil.GradutaionYear = @class.GraduationYear
,这是一个非常非常糟糕的主意,并且可能非常繁重,非常长,并且可以抛出堆栈OverFlow异常。如果你没有其他选择,你可以在特定情况下使用它,但你必须确定你在做什么。
第三,SaveChange()
也将保存实体和子实体。因此,添加SaveChange()
也会将儿童学生添加到数据库中。
通过了解所有这些,您可以将代码简化为:
classes
这应该有用,告诉我你是否有任何问题
答案 1 :(得分:0)
我发现了自己的错误。当我只添加classes
时,它还向数据库添加了pupils
。解决方案很简单。在将它们添加到数据库之前更新pupils
。
foreach (var @class in classes)
{
foreach (var pupil in @class.Pupils)
{
pupil.GradutaionYear = @class.GraduationYear;
}
await _classRepository.AddClass(@class);
}
await _classRepository.SaveChanges();