2011-06-08 10 views
6

Tengo dos tablas. Estoy actualizando esas tablas usando el marco de la entidad. aquí está mi códigoCómo aplicar la transacción en el marco Entidad

Si cualquier operación de actualización de la tabla falla, no se debe comprometer otro, ¿cómo lo logro en el marco de la entidad?

Respuesta

14
using (TransactionScope transaction = new TransactionScope()) 
{ 
    bool success = false; 
    try 
    { 
     //your code here 
     UpdateTable1(); 
     UpdateTable2(); 
     transaction.Complete(); 
     success = true; 
    } 
    catch (Exception ex) 
    { 
     // Handle errors and deadlocks here and retry if needed. 
     // Allow an UpdateException to pass through and 
     // retry, otherwise stop the execution. 
     if (ex.GetType() != typeof(UpdateException)) 
     { 
      Console.WriteLine("An error occured. " 
       + "The operation cannot be retried." 
       + ex.Message); 
      break; 
     } 
    }  

    if (success) 
     context.AcceptAllChanges(); 
    else  
     Console.WriteLine("The operation could not be completed"); 

    // Dispose the object context. 
    context.Dispose();  
} 
+0

Gracias por su respuesta rápida. Estoy usando el servicio WCF que realiza la operación de la base de datos usando el framwork de la entidad. ¿Hasta este método funcionará en este escenario? – Tuscan

+0

Sí, TransactionScope realiza un bloqueo de código transaccional (utilizado en cualquier lugar). TransactionScope garantiza que los cambios en los objetos en el contexto del objeto se coordinen con una cola de mensajes. – Akhil

+0

thanx una vez más – Tuscan

4

uso TransactionScope

public bool UpdateTables() 
    { 
     using (System.Transactions.TransactionScope sp = new System.Transactions.TransactionScope()) 
     { 
      UpdateTable1(); 
      UpdateTable2(); 
      sp.Complete(); 
     } 
    } 

también necesita añadir a su referencia System.Transactions proyecto

0

No es necesario utilizar un TransactionScope: Entity Framework aplica automáticamente una transacción cuando se llama SaveChanges() en su contexto.

public bool UpdateTables() 
{ 
    using(var context = new MyDBContext()) 
    { 
     // use context to UpdateTable1(); 
     // use context to UpdateTable2(); 

     context.SaveChanges(); 
    } 
} 
0

Usted puede hacer algo como esto ....

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.RepeatableRead })) 
       { 
        using (YeagerTechEntities DbContext = new YeagerTechEntities()) 
        { 
         Category category = new Category(); 

         category.CategoryID = cat.CategoryID; 
         category.Description = cat.Description; 

         // more entities here with updates/inserts 
         // the DbContext.SaveChanges method will save all the entities in their corresponding EntityState 

         DbContext.Entry(category).State = EntityState.Modified; 
         DbContext.SaveChanges(); 

         ts.Complete(); 
        } 
       } 
Cuestiones relacionadas