簡體   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