2017-09-05 79 views
0

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

+0

是否使用IoC容器来保存上下文的副本?如果是这样,请检查您的上下文和ProjectService的范围。您可能会保留上下文的过时副本。 –

+0

我会怎么说?如果它已过时,我该如何更新它? – gib65

回答

1

实体框架为其数据库支持使用SQL。 SQL不会将记录或对象存储在父记录中,它已经为此定义了关系和表。将对象存储在父对象中时,实体框架将只存储其ID,原始对象属性将始终为空。 您需要将您的子对象存储在另一个表中,并且必须为其定义一个单独的类。

现在要获取您的对象,您有两个选项,要么通过使用主表中的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

+0

感谢Afnan,这工作:var data = _project.FirstOrDefault(x => x.Id == someId).Include(“Report”);为了增加一些清晰度,问题的一大部分是我将报告保存到一个应用程序的项目中,然后在完全不同的应用程序(Web API)中检索它。当然,上下文并不了解新报告,但您对使用include(“报告”)的建议似乎会对其进行更新。 – gib65