2011-02-11 8 views
22

Il modello DbContext T4 fornito con CTP5 non ha fixup di associazione e non tutte le proprietà sono contrassegnate come virtuali. Significa che non supporta ChangeTracking quando disconnesso dal contesto? Prima di tutto, supporta ChangeTracking anche se tracciato da Context (tramite proxy dinamici)? Vedo che il requisito per il rilevamento delle modifiche è che tutte le proprietà devono essere contrassegnate come virtuali.EntityFramework CTP5 DbContext T4 Modello "virtuale" parola chiave

Stiamo perdendo funzionalità utilizzando il generatore DbContext rispetto al generatore EF4 POCO?

Qualsiasi risposta è molto apprezzata.

+0

Questa domanda riguarda in parte le cose qui: http://stackoverflow.com/questions/5340990/ado-net-dbcontext-generator-vs-ado-net-poco-entity-generator – gregmac

+3

My 2cents. L'API DbContext (utilizza il primo modello t4 del codice) è solo un wrapper attorno a ObjectContext (che utilizza il modello P4 di T4). Quindi, probabilmente, non dovresti perdere nessuna funzionalità, ma al momento attuale (se lavori con limiti di tempo), ti consiglio di utilizzare ObjectContext perché l'aiuto ti arriverà prima ed è molto ben documentato. Ho pensato che tutte le proprietà sono contrassegnate come virtuali in entrambi i modelli T4 per la generazione di proxy dinamici. Buono a sapersi non è il caso – DotNetInfo

+1

Ciao, non so se sei ancora con questo, ma penso che dovresti provare EF 4.1. I proxy dinamici vengono generati automaticamente attorno alle classi POCO generate da un generatore DbContext. Nessuna parola chiave virtuale necessaria per il rilevamento delle modifiche, ad esempio. E se hai bisogno di ObjectContext, puoi accedervi da de DbContext (dopo alcune operazioni di cast), quindi non perdi nessuna funzionalità –

risposta

0

Le proprietà contrassegnate come virtuali sono le proprietà di un altro tipo di entità. proprietà come string, int ecc. non sono mai contrassegnate come virtuali.

1

Si tratta di carichi desiderosi e pigri. Date un'occhiata a questo

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

penso le classi che vengono generati utilizzando il generatore DbContext useranno solo "i proxy lazy loading" e non "il rilevamento delle modifiche proxy" (nota ci sono due tipi di proxy) come descritto in http://blogs.msdn.com/b/adonet/archive/2009/12/22/poco-proxies-part-1.aspx. Come hai sottolineato, tutte le proprietà mappate devono essere virtuali affinché i proxy di monitoraggio delle modifiche funzionino. Questo non è richiesto solo per i proxy di caricamento lazy (dove solo le proprietà di navigazione devono essere virtuali).

Penso che Microsoft dovrebbe cambiare questo nel modello T4 perché senza i proxy di rilevamento delle modifiche, è molto più lento. Soprattutto se hai molte entità nel contesto dell'oggetto.

Sono stato in grado di confermare questo. Nel libro Programming Entity Framework: DbContext, a pagina 66 ne parla. È possibile utilizzare un codice simile al seguente per verificare che un oggetto stia utilizzando un proxy per il rilevamento delle modifiche.

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

Sono sorpreso che il modello T4 non rende tutte le proprietà virtuali per impostazione predefinita. Sembra uno strano controllo a meno che non ci sia una ragione per cui lo hanno fatto intenzionalmente per qualche motivo.