2012-09-03 13 views
9

Ho un'app WPF che ha una griglia con un elenco di dati che ho caricato con EF. Alcune altre finestre possono apportare modifiche agli stessi dati caricati sulla griglia ma utilizzando un'istanza di dbcontext diversa. Come posso vedere i dati modificati sulla griglia? So che posso aggiornare una singola entità con ctx.Entry<MyEntity>(instance).Reload(); - ma voglio vedere tutte le modifiche e non importa quello che faccio, vedo solo i vecchi valori. Non riesco a utilizzare AsNoTracking né creare una nuova istanza DbContext in questo caso.Carica le modifiche apportate in un altro DbContext

+0

Perché non è possibile utilizzare 'AsNoTracking'? –

+0

Perché l'utente può apportare modifiche direttamente alla griglia e salvarlo. – user1526627

+0

Ma in tal caso è possibile aver modificato i dati non salvati e il ricaricamento può far sì che questi dati siano diversi? Come vuoi risolvere questo problema? –

risposta

13

Per me sembra un caso molto semplice e non riesco a capire perché EF non solo aggiorni i valori delle entità.

EF ha anche questo meccanismo ma non è esposto sull'API DbContext. Devi tornare a ObjectContext. Se si desidera solo ricaricare insieme di entità si chiamerà:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload); 

RefreshMode.StoreWins provoca tutte le modifiche in sospeso per essere sovrascritti dai valori ricaricati. Puoi anche utilizzare RefreshMode.ClientWins che manterrà le tue modifiche e le unirà con i dati ricaricati. Il problema con questo approccio è che ricarica solo le entità che già possiedi. Non otterrai nuove entità.

Se si desidera ottenere nuove entità così è necessario eseguire una query e si deve dire EF che si desidera ricaricare valori:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
var objectSet = objectContext.CreateObjectSet<MyEntity>(); 
objectSet.MergeOption = MergeOption.OverwriteChanges; 
var result = objectSet.Where(...).ToList(); 

Anche in questo caso MergeOption.OverwriteChanges sovrascrive tutte le modifiche in sospeso, ma è possibile utilizzare MergeOption.PreserveChanges per unire ricaricato valori ai valori modificati.

Penso che ci possano essere ancora alcuni problemi con valori di aggiornamento con alcune relazioni e forse anche entità che sono state cancellate nel database.

+0

Questo è esattamente ciò di cui ho bisogno, grazie, la mia fiducia su EF è stata ripristinata :) – user1526627

+0

@ ladislav-mrnka Una domanda, l'ultimo passaggio è davvero necessario? Se ti ho capito bene, EF riconoscerà solo le modifiche ai record che italready ha caricato e le unisce al primo modo. Quindi, se dovessi aggiungere manualmente una nuova riga a una tabella, non verrebbe aggiornata in dbcontext utilizzando il primo modo? Ho appena provato questo e non ho visto la necessità del secondo modo. Forse il comportamento è cambiato o ti ho completamente frainteso? :) – DrCopyPaste

Problemi correlati