¿Cómo utilizar transacciones con Entity Framework? C# .Net

Las transacciones son útiles cuando hablamos de base de datos y debemos hacer muchas consultas en conjunto, ya que nos permiten realizar un retroceso en la manipulación de datos si una de las consultas del conjunto falla.

Con Entity Framework es posible realizar transacciones, y no solo eso, sino que podemos tener el poder de realizar otras funciones distintas a manipulación de datos y decidir si fallan estas otras funciones aplicar un rollback.

A continuación te mostrare con un pequeño ejemplo.

Teniendo nuestro Entity Framework con el nombre MiEntity:


//creamos nuestro contexto
 using (var db = new MiEntity())
{
                //creamos el ámbito de la transacción
                using (var dbContextTransaction = db.Database.BeginTransaction())
                {
                    try
                    {
                        //una consulta
                        tabla oTabla = new tabla();
                        oTabla.campo="pato";

			//agregamos el elemento
                        db.tabla.Add(oTabla);

			//otra consulta
                        tabla2 oTabla2 = new tabla2();
                        oTabla2.campo="pato";

			//agregamos otro elemento
                        db.tabla2.Add(oTabla2);

			//guardamos en la base de datos
                        db.SaveChanges();

                        //hacemos algo extra a manipulación de datos
			//como enviar un mail, suponiendo que regresa true si es exitoso
                        if (!EnviaUnMail())
                        {
                            //hacemos rollback si fallo el envio del mail
                            dbContextTransaction.Rollback();
                        }

                        //Hacemos commit de todos los datos
                        dbContextTransaction.Commit();

                    }
                    catch (Exception ex)
                    {
                        //hacemos rollback si hay excepción
                        dbContextTransaction.Rollback();

                    }
                }
}