Jaki efekt może mieć słowo kluczowe wirtualne w kodzie Entity Framework 4.1 POCO?

Czy słowo kluczowe virtual ma wpływ na właściwości w kodzie EF?. Czy ktoś może opisać wszystkie jego konsekwencje w różnych sytuacjach?

Na przykład, Wiem, że może kontrolować lazy loading -- jeśli użyjesz Wirtualnego słowa kluczowego na właściwości relacji ICollection/one-to-many, domyślnie będzie to lazy-loaded, podczas gdy jeśli zostawisz słowo kluczowe virtual out, będzie to eager-loaded.

Jakie inne efekty może mieć słowo kluczowe virtual w EF z POCO / align = "left" / . Czy powinienem ustawić domyślne używanie virtual we wszystkich moich właściwościach, czy domyślne nie używanie go?

Author: Sorangwala Abbasali, 2011-04-08

2 answers

Jak na razie wiem o tych efektach.

  • Lazy Loading : dowolne virtual ICollections będą lazy-loading, chyba że zaznaczy je inaczej.
  • Bardziej efektywne śledzenie zmian . Jeśli spełnisz wszystkie poniższe wymagania, Twoje śledzenie zmian może wykorzystać bardziej wydajną metodę poprzez zaczepianie wirtualnych właściwości. Z linku:

    Aby uzyskać proxy do śledzenia zmian, podstawową zasadą jest to, że twoja klasa musi być publiczne, nieabstraktowe lub niezabezpieczone. Twoja klasa musi również wdrożyć publiczne virtual getters / setters dla wszystkich właściwości, które są utrzymywane. Na koniec musisz zadeklarować zbiór nawigacja oparta na relacjach właściwości tylko jako ICollection<T>. Nie mogą być betonem implementacja lub inny interfejs które wywodzi się z ICollection<T> (a różnica w stosunku do odroczonego obciążenia proxy)

Kolejny przydatny link opisujący to są wymagania MSDN do tworzenia POCO Proxy .

 181
Author: Scott Stafford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-10 03:39:28

To wirtualne słowo kluczowe jest związane z tematem wczytywania danych z encji Framework(lazy loading, eager loading i explicit loading).

Powinieneś użyć wirtualne słowo kluczowe, gdy chcesz załadować dane z leniwym ładowaniem.

Lazy loading to proces, w którym encja lub kolekcja encji jest automatycznie ładowana z bazy danych przy pierwszym dostępie do niej.

Na przykład, podczas korzystania z klasy entity bloga zdefiniowanej poniżej, POWIĄZANE WPISY będą ładowane przy pierwszym wejściu do właściwości nawigacja po wpisach:

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; }  
}

Leniwe Ładowanie kolekcji postów można wyłączyć, czyniąc właściwość Posts nie wirtualną.

Jeśli leniwe ładowanie jest wyłączone, Ładowanie kolekcji postów nadal może być osiągnięte za pomocą eager loading (za pomocą metody Include) lub jawnie Ładowanie powiązanych podmiotów (za pomocą metody Load).

:

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

Jawne Ładowanie:

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(); 
}
 52
Author: Parsa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 21:07:30