2016-10-17 4 views
1

Wenn das Stück Code unten läuft, erwarte ich EF eine db Abfrage auszuführen, wenn Leitung 3 erreicht ist, und dann (träges Laden) eine zweite db Abfrage, wenn Linie 6 ist erreicht. Wenn ich jedoch mit dem Debugger durch den Code gehe, zeigt SQL Server Profiler an, dass die Abfragen in Zeile 3 (wie erwartet) und Zeile 5 ausgeführt werden!EF führt db Abfrage vor Navigationseigenschaft zugegriffen wird

Wie ist das möglich? Warum wird die zweite Abfrage ausgeführt, bevor auf die Navigationseigenschaft in Zeile 6 zugegriffen wird?

1. using (var context = new Entities()) 
2. { 
3.  var studentList = context.Students.ToList<Student>(); 
4.  var student = studentList.ElementAt<Student>(1); 
5.  student.StudentName = "Zorro"; 
6.  var standard = student.Standard; 
7. } 

Abfrage 1:

SELECT 
    [Extent1].[StudentID] AS [StudentID], 
    [Extent1].[StudentName] AS [StudentName], 
    [Extent1].[StandardId] AS [StandardId], 
    [Extent1].[RowVersion] AS [RowVersion] 
    FROM [dbo].[Student] AS [Extent1] 

Abfrage 2:

exec sp_executesql N'SELECT 
    [Extent1].[StandardId] AS [StandardId], 
    [Extent1].[StandardName] AS [StandardName], 
    [Extent1].[Description] AS [Description] 
    FROM [dbo].[Standard] AS [Extent1] 
    WHERE [Extent1].[StandardId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=2 

enter image description here

+0

Paste diese mindestens so, dass jeder die sql sehen kann. –

+0

ist eigentlich die Navigationseigenschaft bei 5 abgefragt? ist die Navigationseigenschaft virtuell? – DevilSuichiro

+0

Entfernen Sie .tolist(). Es wird die Abfrage –

Antwort

0

Diese Frage stellt alles, was ich über verzögertes Laden hassen. Es ist zu einfach, so etwas zu tun und zwei Abfragen auszuführen, ohne es zu merken, wo man es gut gemacht hätte. Lazy Loading macht es leicht, dies zu verpassen.

IMO sollten Sie es ausschalten.

Wenn Sie wollen sicherstellen, dass Sie die Standard in Ihre ursprüngliche DB-Abfrage erhalten Sie sollten eifrig Last es wie folgt aus:

var studentList = context.Students.Include(x=>x.Standard).ToList<Student>(); 

Auf einer Seite nicht, das wird die ganze Liste von Studenten nach unten ziehen, Sie wollen wahrscheinlich:

var student = context.Students.Include(x=>x.Standard).FirstOrDefault(); 

oder

var student = context.Students.Include(x=>x.Standard).SingleOrDefault(x=>x.Id == 1); 

zu vermeiden overfetchi ng

+0

Ihre Antwort sagt mir, was Ihre Meinung über Lazy Loading ist, was interessant ist, aber leider beantwortet es die Frage nicht. –

+0

@DiegoDeberdt Ihr Problem ist, dass Sie nicht verstehen, was Lazy Loading tut. Die einzige Möglichkeit ist das Euer Laden, wenn Sie nicht zwei Abfragen mit dem obigen Code ausführen möchten. Sie müssen nicht * Lazy Loading * deaktivieren, um dies zu tun, aber ich würde es empfehlen. –

+1

Ich denke, Sie versuchen mir zu helfen, das von mir bereitgestellte Code-Sample zu verbessern. Aber das interessiert mich nicht. Ich versuche zu verstehen, warum die zweite Abfrage ausgeführt wird, bevor auf die Navigationseigenschaft zugegriffen wird. Die Tatsache, dass es 2 Anfragen gibt, stört mich nicht. Daher ist Ihre Antwort neben dem Punkt. –

Verwandte Themen