1

我在 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. 我对每个集合运行完全相同的测试(第 1 轮和第 2 轮应该有 4 个答案。第 3 轮应该有 1 个答案。)
  2. 如果我在调用“Include”方法时不包含“GamesResults”实体,一切正常。
  3. 因此,仅当我同时包含“GamesResults”和“Answers”时才会出现问题。
4

0 回答 0