2016-07-15 142 views
5

Sto tentando di utilizzare SqlBulkCopy in DbContext. La stringa My Sql Connection ha UserId e Password ed è per questo motivo che per passare l'oggetto di connessione a SqlBulkCopy sto creando un oggetto SqlConnection con un SqlCredential e passando l'oggetto SqlConnection a SqlBulkCopy. L'inizializzazione del mio SqlBulkCopy appare come sotto.C# converti DbContextTransaction in SqlTransaction

Ma il problema qui è il terzo parametro del costruttore dovrebbe essere un SqlTransaction. Nel mio caso ho già il mio DbContext che si arruola con la transazione del mio servizio.

Come convertire DbContextTransaction (DbContext.Database.CurrentTransaction) in SqlTransaction.

+0

Lanciatelo a 'SqlTransaction' probabilmente? –

risposta

7

Hai bisogno di un'istanza del DbContext o un IDbTransaction per ottenere l'UnderlyingTransaction:

DbContext:

var bulkCopy = new SqlBulkCopy("", SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.KeepNulls, 
     (myDbContext.Database.CurrentTransaction.UnderlyingTransaction) as SqlTransaction)) ; 

IDbTransaction:

using (IDbTransaction tran = conn.BeginTransaction()) 
{ 
    var bulkCopy = new SqlBulkCopy("", SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.KeepNulls, tran as SqlTransaction); 
} 

SqlTransaction ereditato da DbTransaction!

Nota:

Per impostazione predefinita, un'operazione di copia di massa viene eseguita come un'operazione isolata. L'operazione di copia di massa si verifica in un modo transazionale non , con no opportunità per rolling it. Se è necessario eseguire il rollback di tutto o parte della copia bulk quando si verifica un errore, è possibile utilizzare una transazione gestita da SqlBulkCopy, eseguire l'operazione di copia bulk all'interno di una transazione esistente (come nell'esempio DbContext e passarlo come parametro è facoltativo) , o essere incluso nella transazione come nell'esempio di IDbTransaction.

+1

Grazie mille per la risposta. Lascia che esegua la pace del codice –