我在SQL Server数据库中有以下(子集),它是由Entity Framework 6.1代码优先生成的:
然后我运行以下查询
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
属性?为什么它在某些情况下有效而在其他情况下无效?
答案 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