[英]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.GraduationYear
, copy
同時更新copy
和pupil
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.