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
Paste diese mindestens so, dass jeder die sql sehen kann. –
ist eigentlich die Navigationseigenschaft bei 5 abgefragt? ist die Navigationseigenschaft virtuell? – DevilSuichiro
Entfernen Sie .tolist(). Es wird die Abfrage –