实体框架不会为一列添加值

时间:2018-01-07 13:51:03

标签: c# sql entity-framework asp.net-core

我想使用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字段尚未在数据库中更新,它仍为空。

Screenshot

我该如何解决?

修改

在检入调试器后,我确信有一件事,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;
}

2 个答案:

答案 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();