2010-03-22 11 views
13

Eventuali duplicati:
Entity Framework with NOLOCKCome forzare Entity Framework di non bloccare il database

sto usando EF4 e .Net 4 a caricare un po 'di XML da un file in un database .

Ho una classe che avvolge ObjectContext e ha metodi che aggiungono gli oggetti sottoposti a marshalling dal file XML alle varie EntityCollections che rappresentano le mie tabelle.

Ogni file XML contiene in media circa 200.000 oggetti, la classe wrapper crea ObjectContext sulla costruzione e memorizza il riferimento in una variabile di classe privata locale che viene quindi utilizzata dai metodi.

Quando avrò finito di creare le entità mi chiamano:

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 

Questo crea una transazione sul server che è secondo il disegno EntityFramework. Tuttavia questa transazione blocca completamente il mio DB anche su tabelle che non vengono aggiunte.

ho provato varie cose per cercare di aggirare questo involucro tra cui salvare le modifiche in un TransactionScope come questo:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress, 
     new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })) 
     { 
      entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 

      transaction.Complete(); 
     } 

Inoltre ho provato a creare il TransactionScope prima di creare l'ObjectContext nel tentativo di influenzare il sottostante transazione utilizzata durante SaveChanges.

Idealmente, vorrei caricare più file contemporaneamente, ma questo sarà impossibile se il DB è bloccato durante le modifiche di salvataggio.

Qualcuno sa come risolvere questo problema? C'è via per forzare EntityFramework a non utilizzare una transazione?

Grazie per qualsiasi aiuto in anticipo.

James

+0

Penso che il problema qui sia che stai usando TransactionScopeOption.Supress. Prova ad usare Required. –

risposta

13

solo per mettere questo a letto im intenzione di inviare ciò che la mia soluzione era.

mi hanno praticamente guardando questo dalla parte sbagliata del problema, una transazione viene utilizzata quando si chiama SaveChanges() ma si può ancora leggere il database utilizzando un metodo come questo:

private static FrameEntities GetEntities() 
    { 
     FrameEntities entities = new FrameEntities(); 
     entities.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); 
     return entities; 
    } 

Questa imposta l'isolamento livello prima di provare a leggere.

Questo in genere non è consigliabile in quanto è possibile leggere "sporco" di dati parziali ma per quello che sto facendo bene.

+3

Questo non funziona. L'impostazione del solo livello di isolamento della transazione non avrà alcun effetto. In realtà è necessario essere in esecuzione all'interno di una transazione per fare in modo che abbia alcun effetto. La documentazione MSDN per READ UNCOMMITTED afferma che le transazioni in esecuzione al livello READ UNCOMMITTED non emettono blocchi condivisi. Ciò implica che è necessario essere in esecuzione all'interno di una transazione per ottenere il vantaggio. (tratto da msdn.microsoft.com/en-gb/library/ms173763.aspx).Il tuo approccio potrebbe essere meno invadente, ma non otterrà alcun risultato se non utilizzi una transazione. –

Problemi correlati