我有一個包含“Week”類的 DbSet。類中的屬性之一是包含類“Day”的串列。
public class Week
{
[Key]
public int Id { get; set; }
public List<Day> Days { get; set; }
public bool Ferie { get; set; }
public int WeekNo { get; set; }
public int Year { get; set; }
}
public class Day
{
[Key]
public int Id { get; set; }
public List<ProjectTask> Tasks { get; set; }
public DateTime Date { get; set; }
public int AvailableHours { get; set; }
public int HoursLeftToBook { get; set; }
public string? DayName { get; set; }
public int Priority { get; set; }
}
資料庫設定如下,帶有遷移。我在更改后創建了一個新聞遷移,所以資料庫應該是最新的。
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
Database.Migrate();
}
public DbSet<Week> Weeks { get; set; }
}
目前,我正在從控制器測驗資料庫。首先,我加載mockdata,將其保存到資料庫中,然后再次從資料庫中加載資料,以便在頁面上顯示。
public IActionResult Index()
{
PlannerViewModel plannerViewModel = new();
var mock = _plannerService.MockData();
// Save to database
_dataService.SaveWeeks(_plannerService.AssignProjects(mock));
// Get from database
plannerViewModel.Weeks = _dataService.GetWeeks();
return View(plannerViewModel);
}
保存和回傳表的方法,供參考:
public void SaveWeeks(List<Week> weeks)
{
_db.Weeks.AddRange(weeks);
_db.SaveChanges();
}
public List<Week> GetWeeks()
{
return _db.Weeks.ToList();
}
加載時頁面上的周顯示正常,并包含正確的日期。之后我注釋掉獲取模擬資料并將其保存到資料庫的行,因為模擬資料已經添加。只是行“_dataService.GetWeeks();” 保留(當然還有 viewModel 代碼),然后重新運行專案。現在仍然可以正確地從資料庫中獲取周數,但是突然每周中的天數串列為空。我檢查了資料庫,兩次運行之間沒有任何變化。關系是否連接不正確?如果是這樣,為什么它會在第一次作業,而不是以下?
uj5u.com熱心網友回復:
這可能是因為您獲取資料的方法不是急切地加載相關資料.Include。當您呼叫將物體添加到 DbContext 的資料時,該 DbContext 將跟蹤那些新添加的物體以及與它們一起添加的任何相關物體。當您從 DbContext 讀取頂級物體(周)時,即使您不急切地加載子物體(天),由于 DbContext 已經在跟蹤天數,它仍然會填充這些子關系。
您第二次依賴資料庫中已有的資料。DbContext不跟蹤這些物體,因此當您獲得時,dbContext.Weeks.ToList()您只會獲得周數,而沒有相關的天數。
每當您在獲取物件圖時期望相關資料時,請確保:
A) 總是急切加載相關資料:
var weeks = dbContext.Weeks.Include(w => w.Days).ToList();
B) 在不需要物體的地方依靠投影獲得所需的資料:
var weekDetails = dbContext.Weeks
.Select(w => new WeekDetailViewModel
{
Id = w.Id,
WeekNo = w.WeekNo,
Days = w.Days.Select(d => new DayDetailViewModel
{
Id = d.Id,
// ...
}).ToList()
}).ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/387514.html
