【发布时间】:2017-09-06 09:22:20
【问题描述】:
我有一个关于 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...
}
^ 用户在表单上填写一些信息并单击提交后,上面的代码就会运行。信息作为称为“数据”的 json 字符串传递给 SubmitData(...)。检索要保存报告的项目,将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...
}
但报告始终为空。
我已验证 GetTop3ReportCard(...) 调用中的 reportId 不是 0。projectId 也不是。
解决此问题的唯一方法是在 Visual Studio 中重新启动应用程序。一旦我这样做了,然后尝试检索我的报告,它就会返回不为空。
但是为什么像 Project 这样的实体在保存到数据库后不会被 EntityFramework 加载所有属于它的报告? EntityFramework 的工作方式有什么我不知道的吗?
【问题讨论】:
-
您是否使用 IoC 容器来保存您的上下文副本?如果是这样,请检查您的上下文和 ProjectService 的范围。您可能会保留上下文的过时副本。
-
我怎么知道?如果它已经过时了,我该如何更新它?
标签: c# entity-framework