我在 Entity Framework 5 中有一个奇怪的行为
我使用以下代码加载实体“问题”(以及用户给出的答案和结果),然后我测试所有问题是否都有应有的答案数量(第 1 轮和第 2 轮问题的 4 个答案和 1第三轮问题的答案):
var round1Questions = Entities.Questions.Where(q => q.Round == 1)
.OrderBy(r => Guid.NewGuid()).Take(numOfQuestions).ToList();
var round2Questions = Entities.Questions.Where(q => q.Round == 2)
.OrderBy(r => Guid.NewGuid()).Take(numOfQuestions).ToList();
var round3Questions = Entities.Questions.Where(q => q.Round == 3)
.OrderBy(r => Guid.NewGuid()).Take(numOfQuestions).ToList();
/* ==== BEGIN TEST ==== */
foreach (var q in round1Questions)
{
if ((q.Round != 3 && q.Answers.Count != 4) || (q.Round == 3 && q.Answers.Count != 1))
throw new InvalidDataException("This question has less answers than it should");
}
/* ==== END TEST ==== */
/* ==== BEGIN TEST ==== */
foreach (var q in round2Questions)
{
if ((q.Round != 3 && q.Answers.Count != 4) || (q.Round == 3 && q.Answers.Count != 1))
throw new InvalidDataException("This question has less answers than it should");
}
/* ==== END TEST ==== */
/* ==== BEGIN TEST ==== */
foreach (var q in round3Questions)
{
if ((q.Round != 3 && q.Answers.Count != 4) || (q.Round == 3 && q.Answers.Count != 1))
throw new InvalidDataException("This question has less answers than it should");
}
/* ==== END TEST ==== */
如您所见,我运行测试来验证数据。上面的代码完美运行:没有抛出异常。
但是,如果我使用实体“Answers”和“GameResults”的早期加载(测试不需要,但在其他地方使用),则某些行的测试会失败。这是为什么?这是“损坏”的代码:
var round1Questions = Entities.Questions.Include("Answers").Include("GamesResults")
.Where(q => q.Round == 1).OrderBy(r => Guid.NewGuid())
.Take(numOfQuestions).ToList();
var round2Questions = Entities.Questions.Include("Answers").Include("GamesResults")
.Where(q => q.Round == 2).OrderBy(r => Guid.NewGuid())
.Take(numOfQuestions).ToList();
var round3Questions = Entities.Questions.Include("Answers").Include("GamesResults")
.Where(q => q.Round == 3).OrderBy(r => Guid.NewGuid())
.Take(numOfQuestions).ToList();
/* Omitted the test code because it's the same as above */
PS:它总是在某些行的第一次测试中失败,但不是全部。并且数据模型是由 Visual Studio 使用设计器自动生成的。
更新
- 我对每个集合运行完全相同的测试(第 1 轮和第 2 轮应该有 4 个答案。第 3 轮应该有 1 个答案。)
- 如果我在调用“Include”方法时不包含“GamesResults”实体,一切正常。
- 因此,仅当我同时包含“GamesResults”和“Answers”时才会出现问题。