Какой эффект могут оказать виртуальные ключевые слова в Entity Framework 4.1 POCO Code First? - PullRequest
219 голосов
/ 08 апреля 2011

Влияет ли ключевое слово virtual на свойства в EF Code First ?. Может ли кто-нибудь описать все его последствия в разных ситуациях?

Например, я знаю, что он может управлять отложенной загрузкой - если вы используете виртуальное ключевое слово в свойстве отношения ICollection / one-to-many, оно будет загружаться с отложенной загрузкой по умолчанию, тогда как если Вы пропускаете виртуальное ключевое слово, оно будет загружено.

Какие еще эффекты могут иметь ключевое слово virtual в EF с сущностями POCO ?. Должен ли я установить по умолчанию virtual для всех моих свойств или по умолчанию не использовать его?

Ответы [ 2 ]

187 голосов
/ 08 апреля 2011

Пока что я знаю об этих эффектах.

  • Ленивая загрузка : Любые virtual ICollections будут загружаться с отложенной загрузкой, если вы специально не отметите их иначе.
  • Более эффективное отслеживание изменений .Если вы соответствуете всем следующим требованиям, то отслеживание изменений может использовать более эффективный метод, подключая ваши виртуальные свойства.По ссылке:

    Чтобы получить прокси отслеживания изменений, основное правило заключается в том, что ваш класс должен быть общедоступным, неабстрактным или незапечатанным.Ваш класс должен также реализовать общедоступные виртуальные методы получения / установки для всех сохраняемых свойств.Наконец, вы должны объявить свойства навигации отношений на основе коллекции только как ICollection<T>.Они не могут быть конкретной реализацией или другим интерфейсом, производным от ICollection<T> (отличие от прокси с отложенной загрузкой)

Еще одна полезная ссылка, описывающая это, - требования MSDN для создания POCO-прокси .

58 голосов
/ 06 января 2016

Это виртуальное ключевое слово связано с темой загрузки данных из структуры сущностей (отложенная загрузка, полная загрузка и явная загрузка).

Вы должны использовать ключевое слово virtual , если вы хотите загрузить данные с отложенной загрузкой.

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

Например, при использовании класса сущности Блог, определенного ниже, соответствующие сообщения будут загружаться при первом обращении к свойству навигации по сообщениям:

public class Blog 
{  
     public int BlogId { get; set; }  
     public string Name { get; set; }  
     public string Url { get; set; }  
     public string Tags { get; set; }  
     public virtual ICollection<Post> Posts { get; set; }  
}

Ленивую загрузку коллекции Posts можно отключить, сделав свойство Posts не виртуальным.

если отложенная загрузка отключена, загрузка коллекции Posts все еще может быть достигнута с помощью активной загрузки (с помощью метода Include) или явной загрузки связанных объектов (с помощью метода Load).

Стремительно загружается:

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 
}

явно загружается:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Load the posts related to a given blog 
    context.Entry(blog).Collection(p => p.Posts).Load(); 
}
...