【问题标题】:Child entities not persisting when added to parent entity添加到父实体时子实体不持久
【发布时间】: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


【解决方案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

【讨论】:

  • 感谢 Afnan,这有效: var data = _project.FirstOrDefault(x => x.Id == someId).Include("Report");只是为了增加一些清晰度,问题的很大一部分是我将报告保存到一个应用程序中的项目中,然后在一个完全不同的应用程序(Web API)中检索它。当然上下文不知道新报告,但是您关于使用 include("Report") 的建议似乎更新了它。
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多