实体框架查询在调试期间返回不同的结果

时间:2016-04-15 00:04:33

标签: c# entity-framework linq

我正面临一个奇怪的问题,我称之为schrodinger错误。我有一个实体框架查询我使用Linq在运行时返回一些东西,但是当我调试它返回其他东西。

我正在按ID搜索表格实体列表中的项目。我在执行查询后在行中添加了一个断点,并在第一次运行时返回一个id应该与id“-1”匹配的对象。但是我没有在该表中将任何Id设置为“-1”id。如果我将执行指针带回查询并再次执行它,则返回预期值:null。 我在这里添加了几个调试器的屏幕截图,以使其更清晰。

第一遍:

enter image description here

第二遍:

enter image description here

正如您在第一个屏幕截图中看到的那样,要搜索的ID设置为“-1”,但返回的对象的ID设置为“18”。

这是一个更完整的剪辑导致错误的代码。

foreach (var answer in question.Answers)
{
    if (answer.Sentence != null)
    {
        var a = q.Answers.FirstOrDefault(x => x.Id == answer.Id);

        if (a == null || answer.Id == -1)
        {
            if (q.Answers == null)
                q.Answers = new List<Answer>();

            a = new Answer();
            q.Answers.Add(a);
        }

        a.IsRight = answer.IsRight;

        var id = answer.Sentence.Id;
        var qryResult = dataContext.Sentences.Where(s => s.Id == id);
        a.Sentence = qryResult.Any() ? qryResult.First() : null;

        if (a.Sentence == null)
        {
            a.Sentence = new Sentence()
                        {
                            Text = answer.Sentence.Text,
                            IsQuestion = false
                        };
        }
    }
}

根据要求,以下是实体模型:

public class Exam
{
    public int Id { get; set; }
    public string Description { get; set; }
    public DateTime Date { get; set; }
    public virtual ICollection<Question> Questions { get; set; }
}

public class Question
{
    [Key]
    public int Id { get; set; }
    public virtual Sentence Sentence { get; set; }
    public virtual ICollection<Answer> Answers { get; set; }
    public virtual Answer GivenAnswer { get; set; }
}

public class Answer
{
    [Key]
    public int Id { get; set; }
    public virtual Sentence Sentence { get; set; }
    public bool IsRight { get; set; }
}

public class Sentence
{
    [Key]
    public int Id { get; set; }
    public string Text { get; set; }
    public bool IsQuestion { get; set; }
    public string RelatedTopics { get; set; }
}

0 个答案:

没有答案