为什么Entity Framework 6.1不一致地检索相关实体?

时间:2015-11-24 17:58:14

标签: c# entity-framework ef-code-first

我在SQL Server数据库中有以下(子集),它是由Entity Framework 6.1代码优先生成的:

Database schema

然后我运行以下查询

var response = await Context.SurveyResponses 
            .Include(x => x.Answers) 
            .SingleOrDefaultAsync(x => x.Client.Id == clientId && 
            x.Survey.Id == surveyId && 
            !x.CompletedOn.HasValue); 

在99%的情况下,Question集合上的Answers对象将被填充。然而,在1%的情况下,它将为空。

通过改进Include语句解决了这个问题,如下所示

var response = await Context.SurveyResponses 
            .Include(x => x.Answers.Select(y => y.Question))
            .SingleOrDefaultAsync(x => x.Client.Id == clientId && 
            x.Survey.Id == surveyId && 
            !x.CompletedOn.HasValue); 

然而,我想了解的是为什么第一个查询有效?如何知道包含Question对象的Answers属性?为什么它在某些情况下有效而在其他情况下无效?

1 个答案:

答案 0 :(得分:2)

EF会自动修复它的功能。如果您的上下文已有数据,则会为您填写。

例如,假设身份为1的SurveryResponseAnswer有一个id为1的问题,那么:

var db=new Context();
var test=db.Questions.Where(x=>x.id==1);
var result=db.SurveyResponseAnswers.Where(x=>x.id==1);
// result's Question property is filled in

var db=new Context();
var result=db.SurveyResponseAnswers.Where(x=>x.id==1);
// result's Question property is not filled in