Domanda

Qualcuno ha delle buone informazioni sull'uso del metodo .SaveChanges ()?

Riscontro una varietà di problemi quando tento di utilizzare il metodo .SaveChanges () sul mio oggetto contesto dati. Sto acquisendo dati da un'origine dati esistente, creando gli oggetti EntityFramework / DataService appropriati, popolando tali oggetti creati con dati, aggiungendo tali oggetti al contesto e quindi salvando tali dati chiamando .SaveChanges.

Gli scenari che ho escogitato (e i problemi ad essi associati) sono tali ... In ogni scenario ho un ciclo foreach che prende dati dalle righe in una DataTable e genera gli oggetti, collegandoli a il contesto come vanno. (nota: tre oggetti un "membro" e due "indirizzi" che sono collegati tramite una chiamata SetLink) - fondamentalmente questo è uno strumento di conversione per prendere i dati da un archivio dati e massaggiarli in un archivio dati esposto da Dati Servizi.

  • Chiama .SaveChanges () senza parametri una volta alla fine del ciclo foreach (ovvero all'esterno del ciclo)
    • Errore OutOfMemory a circa 1/3 del percorso (30.000 su 90.000 salvataggi) - non sei sicuro di come stia accadendo, dato che ogni elemento di salvataggio è una chiamata SQL separata al database, cosa c'è a corto di memoria?
  • Chiama .SaveChanges () senza parametri una volta per loop
    • Funziona, ma richiede assolutamente per sempre (8 ore per 90.000 salvataggi)
  • Chiama .SaveChanges (SaveChangesOption.Batch) una volta alla fine del ciclo foreach
    • Stesso errore OutOfMemory, ma senza alcun salvataggio nel database
  • Chiama .SaveChanges (SaveChangesOption.Batch) una volta per loop
    • errore 404 non trovato
  • Chiama .SaveChanges (SaveChangesOption.Batch) una volta per 10 loop
    • Errore 400 Richiesta non valida (occasionalmente)
    • OutOfMemory dopo una serie di iterazioni
  • Un numero di tentativi casuali di creare il contesto una volta per ciclo o di averlo come variabile all'inizio del ciclo o di averlo come variabile membro privata disponibile.
    • Risultati diversi, incapaci di quantificare, nessuno davvero così buono

Qual è il metodo preferito per chiamare .SaveChanges () da un oggetto client quando si esegue un grande caricamento di dati in questo modo? C'è qualcosa che non capisco su come funziona .SaveChanges ()? Qualcuno può fornire maggiori dettagli su come una volta utilizzare questa funzione e quali (se presenti) sono le limitazioni al salvataggio dei dati tramite Data Services? Esistono buone pratiche in merito alla chiamata del metodo .SaveChanges ()? Esiste una documentazione particolarmente valida sulla chiamata del metodo .SaveChanges ()?

È stato utile?

Soluzione

Non ho una grande esperienza nell'uso di EntityFramework (solo qualche esperimento casuale), hai provato a chiamare .SaveChanges () ogni n iterazioni?

Intendo qualcosa del genere:

int i = 0;
foreach (var item in collection)
{
    // do something with your data
    if ((i++ % 10) == 0)
        context.SaveChanges();
}
context.SaveChanges();

So che è brutto, ma è la prima possibile soluzione che mi è venuta in mente.

Altri suggerimenti

Sto usando EntityFramework anche su un piccolo progetto, quindi sono anche molto interessato alla domanda. Due domande veloci:    Hai provato a disattivare la memorizzazione nella cache degli oggetti dati nel datacontext?    Hai provato a chiudere il datacontext e ne hai creato uno nuovo durante il ciclo per liberare memoria?

Saluti

Kenneth

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top