简体   繁体   English

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

[英]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字段尚未更新,它保持为空。

Screenshot 屏幕截图

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

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