我有一个关于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...
}
^上述代码在用户填写表单上的某些信息并单击“提交”后运行。信息作为名为“data”的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中重新启动应用程序。一旦我这样做,然后尝试检索我的报告,它就会返回为空。
但是为什么像EntityFramework这样的实体一旦被保存到数据库就不会被属于它的所有报告加载?有没有关于EntityFramework的工作方式,我不知道在这里?
答案 0 :(得分:1)
实体框架使用SQL作为其数据库支持。 SQL不会在父记录中存储记录或对象,它为此定义了关系和表。将对象存储在父对象中时,实体框架将仅存储其ID,并且原始对象属性将始终保持为null。 您需要将子对象存储在另一个表中,并且必须为其定义一个单独的类。
现在要获取对象,您有两个选项,查询该对象的表以通过使用主表中的id获取对象或使用include方法。
var rep = Report.FirstOrDefault(r => r.ReportId == reportId);
或者
var data = _project.FirstOrDefault(x => x.Id == someId).Include("Report");