Разница между использованием метода Load и отложенной загрузкой в ​​платформе сущностей - PullRequest
0 голосов
/ 13 июля 2011

Я прочитал это В чем разница между ленивой загрузкой и потоком Load () , чтобы понять разницу между использованием метода Load и отложенной загрузкой в ​​платформе сущностей.Но в этом примере использование ленивой загрузки и метода Load имеют одинаковый эффект.Можете ли вы дать мне пример, чтобы понять, где использовать ленивую загрузку и где использовать метод Load?

Ответы [ 2 ]

2 голосов
/ 13 июля 2011

Если предположить, что Ленивая загрузка выключена, а адреса не были в методе Включить , следующий бит кода вызовет исключение, поскольку адреса будут пустыми.

var query = from c in context.Contacts select c;
foreach ( var contact in query ) {
     if ( contact.ID == 5 ) {
        Console.WriteLine( contact.Addresses.City );
     }
}

Добавление вызова загрузки:

var query = from c in context.Contacts select c;
foreach ( var contact in query ) {
     if ( contact.ID == 5 ) {
        contact.Addresses.Load()
        Console.WriteLine( contact.Addresses.City );
     }
}

Явно загружает адреса и поэтому исключает исключение.

Если Ленивая загрузка находится в первом блоке кода, также не будет возникать исключение, потому что EF будет загружать адреса для вас - без каких-либо явных вызовов.

Надеюсь, это немного поможет ...

1 голос
/ 13 июля 2011

Ленивая загрузка фактически вызывает метод Load, даже если мы также используем явную загрузку для этого, потому что вы должны вызвать метод Load вручную. То, что обычно используется в качестве отложенной загрузки в EFv4 +, следует называть прозрачной отложенной загрузкой. Это означает, что вам не нужно делать никаких специальных вызовов, и EF загрузит связь для вас.

EF использует динамические прокси для отложенной загрузки. Эти прокси являются типами, производными от сущностей и созданными во время выполнения. Я не видел код этих прокси, но я полагаю, что они на самом деле вызывают Load в свойстве getter, если поле поддержки равно null.

...