ADO.NET Entity Framework : Executing TSQL and DbContext under same Transaction
There might be a requirement that we need to run a RAW SQL statement and DbContext update under same connection and would like to have the Transaction in place. Let’s see how we can achieve this easily
SQL Table
CREATE TABLE [dbo].[Emp](
[Id] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](50) NOT NULL,
[LastName] [varchar](50) NULL,
CONSTRAINT [PK_Emp] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
C# Code
private static void TransactionSample()
{
int id = 2299;
var trOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted };
using (var tran = new TransactionScope(TransactionScopeOption.Required, trOptions))
{
using (var ctx = new TestDBEntities())
{
try
{
ctx.Database.Connection.Open();
var sqlCommand = ctx.Database.Connection.CreateCommand();
//TODO: You may add some just char to produce bad query
sqlCommand.CommandText = "UPDATE Emp SET FirstName ='FirstName1' WHERE Id=" + id.ToString();
sqlCommand.ExecuteNonQuery();
//TODO: you may add some wrong id so that it will fail
var empUpdate = ctx.Emps.Where(p => p.Id == id).First();
empUpdate.LastName = "LastName1";
ctx.SaveChanges();
tran.Complete();
}
catch
{
Console.WriteLine("Some error occured");
//Fail the Transaction
}
}
}
}