我有一個關於EntityFramework如何工作的問題,因爲它在我正在開發的應用程序中做些奇怪的事情。簡而言之,我將一個子實體(一個報告)添加到一個父實體(一個項目),並將其保存到數據庫,然後當我試圖檢索它時,子實體(報告)不在父項目中實體(項目)。將子實體添加到父實體時不會持久
下面是我在做什麼的更詳細的步驟:
public JsonResult SubmitData(int projectId, string data = null)
Project project = _projectService.GetProject(projectId);
Report report = CreateReport(data);
project.Report.Add(report);
_projectService.UpdateProjectForReport(project);
// Rest of code omitted...
}
public class ProjectService : IProjectService
{
public void UpdateProjectForReport(Project project)
{
_context.SaveChanges();
}
// Rest of code omitted...
}
^上面的代碼獲取用戶填寫後,在一張表上的一些信息,並點擊提交運行。信息被傳遞給SubmitData(...)作爲一個名爲「data」的json字符串。檢索報告所要保存的項目,將json數據轉換爲報告,將報告添加到項目中,並將對項目所做的更改保存到數據庫中。
我確認報告實際上已保存到數據庫並與項目關聯。
然後下一步涉及檢索報告:
public async Task<HttpResponseMessage> GetTop3ReportCard([FromUri] int
projectId, [FromUri] int reportId = 0)
{
_project = _projectService.GetProject(projectId);
Report report = _project.Report.Where(r => r.ReportId == reportId).FirstOrDefault();
// Rest of code omitted...
}
但報告始終爲空。
我已驗證reportId在GetTop3ReportCard(...)的調用中不是0.既不是projectId。
解決此問題的唯一方法是在Visual Studio中重新啓動應用程序。一旦我這樣做,然後嘗試檢索我的報告,它將返回不爲空。
但是,爲什麼像EntityFramework這樣的實體不能通過EntityFramework加載所有屬於它的報告,一旦它們被保存到數據庫中?有什麼關於EntityFramework的工作方式,我不知道在這裏?
是否使用IoC容器來保存上下文的副本?如果是這樣,請檢查您的上下文和ProjectService的範圍。您可能會保留上下文的過時副本。 –
我會怎麼說?如果它已過時,我該如何更新它? – gib65