2013-08-12 3 views
0

Сколько вам нужно, чтобы «прикоснуться» к навигационной собственности, чтобы обеспечить ленивую загрузку коллекции?Как запустить ленивую загрузку в навигационной собственности?

Я использую Entity Framework 5.0 с включенной ленивой загрузкой. Рассмотрим простой класс:

public class MyResource 
{ 
    string name {get;set;} 
    public virtual ICollection<ResourceEvent> ResourceEvents{ get; set; } 
} 

Когда я создал «Еогеасп» на коллекции, я хочу, чтобы избежать отдельного извлечения каждого объекта в коллекции.

using(context = new MyDBContext) 
{ 
    MyResource aresource = context.MyResources.Where(a=>a.Name==myname).Single(); 

    //now I want to lazy load the ResourceEvents collection 
    if(aresource.MyResources!=null) // will this load collection? 
    { 
     List<ResourceEvent> alist = aresource.MyResources.ToList();//or must I add this? 
     foreach(ResourceEvent re in alist)// (or in aresource.MyResources) 
     { 
     //do something 
     } 
    } 
} 

Я знаю, что я могу использовать Include(), но предположим, что объект MyResource приходит откуда-то, где мы не знаем, был ли сбор был получен или нет.

ответ

0

Вы можете загрузить коллекциям этот путь:

context.Entry(aresource).Collection(p => p.MyResources).Load(); 

Для отдельных ссылок используют Reference() вместо Collection().

+1

Спасибо, я понимаю, что есть способы с нетерпением и явной нагрузкой. Мой вопрос заключался в том, будет ли проверять значение null на ленивую загрузку коллекции? – user2675238

0

Доступ к навигационному свойству будет перечислять коллекцию, что означает, что EF будет загружать все объекты в то время - не один за другим. Это важно знать, потому что, если, скажем, вам нужен первый объект, и вы пишете areasource.MyResources.First(), EF загрузит все объекты сущности для этой коллекции, даже если вы планируете использовать их только. aresource.MyResources будет перечислять коллекцию И ТОГДА будет выполнена операция First().

Чтобы этого избежать, вы хотите получить IQueryable для этого свойства навигации и использовать его. Для примера, я упомянул, вы могли бы сделать следующее:

context.Entry(aresource).Collection(c => p.MyResources).Query().First() 

Это заявление будет только извлечь один объект из БД и не все объекты в коллекции навигации собственности.

+0

Таким образом, проверка на нуль загрузит сбор и дополнительный код: Список alist = aresource.MyResources.ToList() не требуется. Верный? – user2675238

+0

это правильно – Moho

Смежные вопросы