我有一个关于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