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à?
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