2011-02-11 20 views
22

Szablon DbContext T4 dostarczany z CTP5 nie ma powiązania, a nie wszystkie właściwości są oznaczone jako wirtualne. Czy to znaczy, że nie obsługuje funkcji ChangeTracking w przypadku odłączenia od kontekstu? Po pierwsze, czy obsługuje on funkcję ChangeTracking, nawet jeśli jest śledzona przez kontekst (poprzez dynamiczne proxy)? Widzę, że wymóg śledzenia zmian polega na tym, że wszystkie właściwości powinny być oznaczone jako wirtualne.EntityFramework CTP5 DbContext T4 Szablon "wirtualne" słowo kluczowe

Czy tracimy jakąkolwiek funkcjonalność za pomocą generatora DbContext w porównaniu do generatora POCO EF4?

Każda reakcja jest bardzo doceniana.

+0

To pytanie dotyczy częściowo następujących kwestii: http://stackoverflow.com/questions/5340990/ado-net-dbcontext-generator-vs-ado-net-poco-entity-generator – gregmac

+3

My 2cents. DbContext API (Code First t4 template uses) to po prostu wrapper wokół ObjectContext (którego używa szablon POCO t4). Prawdopodobnie nie powinieneś tracić żadnych funkcji, ale w obecnym momencie (jeśli pracujesz pod ograniczeniem czasowym), poleciłbym używać ObjectContext ze względu na pomoc, którą otrzymasz wcześniej i jest ona bardzo dobrze udokumentowana. Myślałem, że wszystkie właściwości są oznaczone wirtualnie w obu szablonach t4 do generowania dynamicznych serwerów proxy. Dobrze wiedzieć, że tak nie jest. – DotNetInfo

+1

Cześć, nie wiem, czy wciąż z tym jesteś, ale myślę, że powinieneś spróbować EF 4.1. Dynamiczne proxy są generowane automatycznie wokół klas POCO generowanych przez generator DbContext. Nie potrzeba więcej wirtualnego słowa kluczowego do śledzenia zmian, na przykład. A jeśli potrzebujesz ObjectContext, możesz uzyskać do niego dostęp z de DbContext (po niektórych operacjach rzutowania), więc nie stracisz żadnej funkcjonalności –

Odpowiedz

0

Właściwości oznaczone jako wirtualne są właściwościami innego elementu typu. właściwości takie jak string, int itp. nigdy nie są oznaczone jako wirtualne.

1

To wszystko jest pełne i leniwego ładowania. Przyjrzeć się tej

http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

public class Person 
    { 
     public int Id { get; set; } 
     public virtual Address Address { get; set; } 
     // ... 
    } 

    public class Address 
    { 
     public int Id { get; set; } 
     public string AddressLine1 { get; set; } 
     // ... 
    } 

    static void Main(string[] args) 
    { 
     MyDatabaseContext db = new MyDatabaseContext(); 
     Person person = db.Persons.Where(x => x.Id == 1).First(); 
     // person.Address is loaded if the propertie Address, class Person 
     // is marked as virtual. If NOT its null. 
    } 
1

myślę klas, które są generowane za pomocą generatora DbContext użyje tylko „leniwe proxy loading” a nie „zmień śledzenia proxy” (uwaga są dwa rodzaje proxy), jak opisano w http://blogs.msdn.com/b/adonet/archive/2009/12/22/poco-proxies-part-1.aspx. Jak zauważyłeś, wszystkie zmapowane właściwości muszą być wirtualne, aby serwery śledzenia zmian działały. Nie jest to wymagane w przypadku leniwych serwerów proxy (gdzie tylko właściwości nawigacji muszą być wirtualne).

Myślę, że Microsoft powinien to zmienić w szablonie T4, ponieważ bez śledzenia zmian proxy, jest o wiele wolniej. Zwłaszcza jeśli w kontekście obiektu znajduje się wiele elementów.

Udało mi się to potwierdzić. W książce Programowanie struktury obiektu: DbContext, na stronie 66 mówi o tym. Możesz użyć kodu podobnego do poniższego, aby sprawdzić, czy obiekt używa proxy śledzenia zmian.

Person p = context.People.Find(123); 
bool b = p is IEntityWithChangeTracker; 

Jestem zaskoczony, że szablon T4 domyślnie nie powoduje, że wszystkie właściwości są wirtualne. Wydaje się dziwnym niedopatrzeniem, chyba że istnieje powód, dla którego zrobili to celowo z jakiegoś powodu.