添加到父实体

时间:2017-09-05 21:53:15

标签: c# entity-framework

我有一个关于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的工作方式,我不知道在这里?

1 个答案:

答案 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");

Read my answer here if you want to learn to define the appropriate relation between the two tables/classes through Entity Framework