[英]Entity Framework does not add value to one column
I want to export data from JSON file to SQL database using Entity Framework. 我想使用实体框架将数据从JSON文件导出到SQL数据库。 I am doing it like this:
我这样做是这样的:
// 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();
}
}
In this method I am updating pupil field called GraduationYear
by copying the value from class entity from filed called GraduationYear
. 在这种方法中,我通过复制来自名为
GraduationYear
类实体的类值来更新名为GraduationYear
的瞳孔字段。 But after this operation, the GraduationYear
field has not been updated in the database, it remains null. 但是执行此操作后,数据库中的
GraduationYear
字段尚未更新,它保持为空。
How can I fix it? 我该如何解决?
edit 编辑
After check in debugger, one thing I am sure, entities in updatedPupils
list have correct value in GraduationYear
field. 在调试器中签入后,我确定,一件事情是,
updatedPupils
列表中的实体在GraduationYear
字段中具有正确的值。
Classes code 班级代码
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; }
}
edit 2 编辑2
public async Task<Pupil> AddPupil(Pupil entity)
{
var result = await _context.Pupils.AddAsync(entity);
return result.Entity;
}
First, take a look to this code : 首先,看一下这段代码:
var copy = pupil;
copy.GradutaionYear = @class.GraduationYear;
updatedPupils.Add(copy);
In c#, the symbol equal =
copy a variable but keep a reference to origin variable, so when you do copy.GradutaionYear = @class.GraduationYear
you update both GradutaionYear
properties of copy
and pupil
vars. 在c#中,符号equal
=
复制变量,但保留对原始变量的引用,因此,在执行copy.GradutaionYear = @class.GraduationYear
, copy
同时更新copy
和pupil
var的GradutaionYear
属性。
So, this code var copy = pupil; copy.GradutaionYear = @class.GraduationYear;
因此,这段代码
var copy = pupil; copy.GradutaionYear = @class.GraduationYear;
var copy = pupil; copy.GradutaionYear = @class.GraduationYear;
is the same as doing pupil.GradutaionYear = @class.GraduationYear
. 与执行
pupil.GradutaionYear = @class.GraduationYear
。
Second, do a SaveChange()
in a loop, it's a very very very bad idea and can be very heavy, very long, and can throw stack OverFlow exception. 其次,在循环中执行
SaveChange()
,这是一个非常非常糟糕的主意,并且可能非常繁琐,很长,并且可能引发堆栈OverFlow异常。 You could use that in specific case if you don't have any others choices, but you must be sure of what you are doing. 如果您没有其他选择,可以在特定情况下使用它,但是您必须确定自己在做什么。
Thridly, SaveChange()
will save entities and children entities too. 通常,
SaveChange()
还将保存实体和子实体。 So adding classes
will also add children pupils to database. 因此,添加
classes
还将把孩子们的小学生添加到数据库中。
By knowing all of that, you can simplify your code to : 通过了解所有这些,您可以将代码简化为:
foreach (var @class in classes)
{
foreach (var pupil in @class.Pupils)
pupil.GradutaionYear = @class.GraduationYear;
await _classRepository.AddClass(@class);
}
await _classRepository.SaveChanges();
This should work, tell me if you have any trouble 这应该可以,请告诉我您是否有任何麻烦
I found my mistake. 我发现了我的错误。 When I was only adding
classes
, it also added pupils
to database. 当我仅添加
classes
,它还将pupils
添加到数据库中。 Solution is simple. 解决方法很简单。 Update
pupils
before adding them to database. 在将
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.