2011-01-12 12 views
31

Sto cercando di risolvere un errore molto simile a quello descritto qui:Che effetto hanno le diverse SaveOptions EF 4 sull'ObjectContext?

InvalidOperationException when calling SaveChanges in .NET Entity framework

Sembra che la soluzione (che non ho ancora provato, è vero) è quello di passare System.Data.Objects .SaveOptions.Non è il parametro SaveOptions per il metodo SaveChanges().

Quindi, prima di farlo, sto cercando di capire esattamente come funzionano i diversi SaveOptions (None, AcceptAllChangesAfterSave, DetectAllChanges). Tuttavia, non sono stato in grado di trovare una spiegazione chiara di ciò, né sono sicuro di quale sia l'impostazione predefinita. Qualcuno può chiarire?

Grazie!

UPDATE: Ho inviato la domanda vero problema qui: System.InvalidOperationException when trying to iteratively add objects using EF 4

risposta

17

Buona domanda (+1).

In poche parole (da quanto ho capito):

SaveOptions.DetectChangesBeforeSave: questo è il valore predefinito. Quando si esegue ObjectContext.SaveChanges(), il metodo DetectChanges() viene chiamato alle entità di collegamento sincronizzate nell'OSM.

SaveOptions.AcceptAllChangesAfterSave: Quando si esegue ObjectContext.SaveChanges(), il metodo AcceptAllChanges() viene chiamato - che è il coraggio della OSM, in cui vengono iterate, indirizzi e impostati Invariato/indipendente delle entità nel grafico.

SaveOptions.None: Quando si esegue ObjectContext.SaveChanges(), le modifiche vengono salvate immediatamente - nessuna sincronizzazione. Qualunque cosa si trovi nel grafico è ciò che verrà salvato.

Nella mia esperienza non ho mai avuto problemi con questo - l'ho lasciato come predefinito (DetectChangesBeforeSave).

A volte con POCO ho sentito che è necessario chiamare esplicitamente DetectChanges, ma non ho mai visto una raccomandazione/soluzione per modificare SaveOptions su none.

Sei sicuro che la soluzione in questa domanda è impostare SaveOptions su none? Forse dovresti fornire dettagli (o porre una domanda separata) sull'errore che ricevi, in quanto una modifica come questa influenzerà l'intero livello di persistenza.

+0

Grazie - Esattamente la ragione per cui ho fatto la domanda, poiché interesserà la mia intera applicazione solo per risolvere questo problema. Sono piuttosto riluttante a farlo con una soluzione che non comprendo appieno. A cosa ti riferisci quando dici OSM? EDIT: ObjectStateManager. Fatto. :) – morganpdx

+0

E sì, dovrei pubblicare una domanda, poiché questa è l'unica soluzione indicata nell'altro problema che afferma di funzionare nel mio caso. Ma sembra essere esattamente lo stesso problema. – morganpdx

+0

@morganpdx - come hai impostato l'EF? stai usando la generazione di codice predefinita o stai usando POCO? E se è così, stai utilizzando qualsiasi tracciamento delle modifiche (ad esempio entità di auto-rilevamento, oggetti proxy, ecc.). Pubblica una domanda con queste informazioni e l'errore/lo scenario/problema che stai riscontrando. – RPM1984

18

correzione di breve per

SaveOptions.DetectChangesBeforeSave: questa è l'impostazione predefinita. Quando si esegue ObjectContext.SaveChanges(), il metodo DetectChanges() viene chiamato alle entità di collegamento sincronizzate nell'OSM.

SaveChanges è una versione di overload di SaveChanges(SaveOptions optsions) metodo, in cui questa versione senza parametri chiama questo

SaveChanges(SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSave) 

SaveOptions è un enum Flag e, in conclusione, SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSave è il default del SaveChanges() non il DetectChangesBeforeSave

Problemi correlati