繁体   English   中英

实体框架不会为一栏增加价值

[英]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.GraduationYearcopy同时更新copypupil 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM