2012-01-31 8 views
7

Ho utilizzato molto Entity Framework in un'applicazione WVF MVVM di recente e ho riscontrato alcuni problemi. Per visualizzare i dati, i miei modelli di visualizzazione utilizzano un ObjectContext di breve durata. Questi modelli di visualizzazione verranno utilizzati in un processo di lunga durata, pertanto ho preferito utilizzare ObjectContext di breve durata per non deteriorare le prestazioni.Entity Framework non tiene traccia delle modifiche alle raccolte quando si ricollega un'entità

Quindi in pratica significa che le mie entità vengono consumate in modalità disconnessa. Queste entrate possono essere create, visualizzate, aggiornate e cancellate. Non ho avuto problemi a salvare le modifiche al database utilizzando la modalità disconnessa. Ma ho trovato un caso particolare in cui le modifiche non vengono salvate senza errori visualizzati sulla chiamata del metodo SaveChanges(). Questo succede quando provo ad aggiornare un'entità che ha una proprietà collection. La proprietà scalare dell'entità viene mantenuta senza problemi, ma le modifiche alle raccolte non si riflettono sul database, come se non fosse in grado di tracciare queste modifiche in fase di riconnessione.

Ecco un esempio di codice del mio caso in cui cambio il nome dell'entità e quindi aggiungo un oggetto alla sua raccolta di report. Dopo SaveChanges(), solo il nome del client si è riflesso sul database.

this.Client.Name = "Test Client"; 
this.Client.Reports.Add(new Report { Name = "Test Report" }); 

using (ReportCompositionEntities entities = new ReportCompositionEntities(this.connectionStringName)) 
{ 
    entities.Clients.ApplyCurrentValues(this.Client); 
    entities.SaveChanges(); 
} 

Così sto facendo facendo qualcosa di sbagliato o EF non è semplicemente in grado di monitorare questo tipo di modifiche quando riattaccare un'entità?

risposta

8

Questo è exactly what happens. Non è previsto il rilevamento delle modifiche e EF non è a conoscenza delle modifiche apportate alla proprietà di navigazione. Inoltre, ApplyCurrentValues è in grado di elaborare solo proprietà scalari e complesse. Non proprietà di navigazione.

Quando si modificano le relazioni in scenari distaccati, è necessario indicare manualmente a EF quali relazioni sono state modificate dopo aver collegato l'entità. È possibile creare alcune logiche personalizzate fornendo queste informazioni e utilizzare ObjectStateManager per configurare gli stati di tutte le relazioni oppure caricare semplicemente la versione corrente con le relazioni dal database e sincronizzare manualmente le modifiche dalla versione separata alla versione allegata caricata.

Btw. Non ho mai usato MVVM quindi non sono sicuro di come si applica in questo caso, ma nel caso di MVP è possibile utilizzare un contesto di lunga durata se viene utilizzato per un'operazione singola, ad esempio la visualizzazione di modifica verrà gestita dal proprio presentatore con il proprio contesto . Questo contesto vivrà fintanto che la vista verrà utilizzata per modificare l'entità singola/aggregato = verrà utilizzata per caricare l'entità e lo stesso contesto verrà utilizzato per salvare l'entità perché in questo caso la modifica viene eseguita dallo stesso contesto di esecuzione e appartiene a singola unità di lavoro.

+0

Caso davvero interessante. Ora il fatto che EF non aggiorni queste modifiche ha senso in quanto l'entità della proprietà di navigazione può anche essere referenziata da un'altra entità. Nessun problema quando viene creata una nuova entità, ma con la cancellazione possono verificarsi problemi di concorrenza. Nella mia architettura, ogni MVVM è una singola responsabilità del paradigma CRUD. Ho spostato la mia VM in modalità connessa (il processo di smaltimento è gestito fuori dalla scatola dalla mia architettura) e la profilazione della memoria non ha rivelato alcun problema per ora. Il tempo ci dirà e in realtà è abbastanza facile tornare alla modalità disconnessa. Grazie per l'aiuto. – Ucodia

Problemi correlati