2010-04-01 1 views
10

Ho problemi con gli oggetti di aggiornamento nel mio database. Ho due PC e due applicazioni.Entity Framework: aggiorna gli oggetti dal database

Sul primo PC, c'è un'applicazione che comunica con il mio database e aggiunge alcuni dati alla tabella delle misure. Sul mio altro PC, c'è un'applicazione che recupera le ultime misurazioni con un timer, quindi dovrebbe ritirare le misurazioni aggiunte dall'applicazione anche sul mio primo PC.

Il problema è che non è così. All'avvio dell'applicazione, memorizza nella cache tutti i dati dal database e non ottiene mai nuovi dati aggiunti. Uso il metodo Refresh() che funziona bene quando cambio uno qualsiasi dei dati memorizzati nella cache, ma non aggiorna i nuovi dati aggiunti.

Ecco il mio metodo che dovrebbe aggiornare i dati:

public static Entities myEntities = new Entities(); 

    public static Measurement GetLastMeasurement(int conditionId) 
    { 
     myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements); 

     return (from measurement in myEntities.Measurements 
       where measurement.ConditionId == conditionId 
       select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
    } 

P.S. Le applicazioni hanno stringhe di connessione differenti in app.config (diversi account per lo stesso DB).

+0

È possibile controllare la mia risposta qui http://stackoverflow.com/questions/1746941/objectcontext-refresh –

risposta

9

Questo dovrebbe funzionare:

public static Entities myEntities = new Entities(); 

public static Measurement GetLastMeasurement(int conditionId) 
{ 
    myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements); 
    var allMeasurements = myEntities.Measurements.ToList();//retrieves all measurements from database 

    return (from measurement in allMeasurements 
      where measurement.ConditionId == conditionId 
      select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
} 

Che senso rende la cache quando si aggiorna negozio ogni volta che si desidera utilizzarlo? È possibile portarlo a:

public Measurement GetLastMeasurement(int conditionId) 
{ 
    var entities = new Entities(); 
    return (from measurement in entities.Measurements 
      where measurement.ConditionId == conditionId 
      select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
} 

Cerca anche nel database con ogni chiamata, ma rende molto meno operazioni.

+0

Prima soluzione che lei ha citato ancora non retrive nuovi dati aggiunti dal mio database. Anche la seconda soluzione che mi aspettavo funzionasse, non funziona. Non lo preferirei perché in questo modo apro un nuovo contesto sul mio database ogni volta che voglio ottenere l'ultima misurazione. Quando riavvio la mia applicazione recupera nuovi dati, ma non ritorna se c'è qualcosa aggiunto mentre l'applicazione sta funzionando. C'è la possibilità che i diversi account che sto usando per ciascuna applicazione (uno che aggiunge e uno che recuperi i dati dal DB) sono la ragione di questo? –

+0

@Nebo: la seconda soluzione non funziona? Cosa restituisce? – LukLed

+0

Con una di queste due soluzioni ottengo la stessa cosa che avevo già. Se modifico una riga in una tabella delle misure (che è stata recuperata all'avvio dell'applicazione), la aggiorna. Ma se aggiungo una nuova riga, non la riacquisterà. In entrambi i casi. Questa volta ho modificato una riga esistente e aggiunta direttamente utilizzando il mio SQL Manangement Studio. –