[英]Entity Framework does not add value to one column
我想使用实体框架将数据从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
的瞳孔字段。 但是执行此操作后,数据库中的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;
}
首先,看一下这段代码:
var copy = pupil;
copy.GradutaionYear = @class.GraduationYear;
updatedPupils.Add(copy);
在c#中,符号equal =
复制变量,但保留对原始变量的引用,因此,在执行copy.GradutaionYear = @class.GraduationYear
, copy
同时更新copy
和pupil
var的GradutaionYear
属性。
因此,这段代码var copy = pupil; copy.GradutaionYear = @class.GraduationYear;
var copy = pupil; copy.GradutaionYear = @class.GraduationYear;
与执行pupil.GradutaionYear = @class.GraduationYear
。
其次,在循环中执行SaveChange()
,这是一个非常非常糟糕的主意,并且可能非常繁琐,很长,并且可能引发堆栈OverFlow异常。 如果您没有其他选择,可以在特定情况下使用它,但是您必须确定自己在做什么。
通常, SaveChange()
还将保存实体和子实体。 因此,添加classes
还将把孩子们的小学生添加到数据库中。
通过了解所有这些,您可以将代码简化为:
foreach (var @class in classes)
{
foreach (var pupil in @class.Pupils)
pupil.GradutaionYear = @class.GraduationYear;
await _classRepository.AddClass(@class);
}
await _classRepository.SaveChanges();
这应该可以,请告诉我您是否有任何麻烦
我发现了我的错误。 当我仅添加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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.