I am using EF6 in my asp.net application. In some code block i am using Transaction Scope. Following is my code
using (VerbaTrackEntities dataContext = new VerbaTrackEntities())
{
TBL_TARGET target = dataContext.TBL_TARGET.Where(x => x.LNG_TARGET_ID == TargetID).SingleOrDefault();
if (target != null)
{
using (var trans = dataContext.Database.BeginTransaction())
{
try
{
System.Data.Entity.Core.Objects.ObjectContext oc = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)dataContext).ObjectContext;
foreach (var Targets in target.TBL_CASE_TARGET.ToList())
{
oc.DeleteObject(Targets);
}
foreach (var Targets in target.TBL_USER_TARGET.ToList())
{
oc.DeleteObject(Targets);
}
foreach (var Targets in target.TBL_FENCE_TARGET.ToList())
{
oc.DeleteObject(Targets);
}
foreach (var Targets in target.TBL_TARGET_COMM.ToList())
{
oc.DeleteObject(Targets);
}
foreach (var Targets in target.TBL_TRG_FENCE_STATUS.ToList())
{
oc.DeleteObject(Targets);
}
foreach (var Targets in target.TBL_TRG_MOVEMENT.ToList())
{
oc.DeleteObject(Targets);
}
TBL_IMAGE deleteImage = dataContext.TBL_IMAGE.Where(s => s.LNG_REF_ID == target.LNG_TARGET_ID && s.INT_TYPE_OF_IMAGE == 2).SingleOrDefault();
if (deleteImage != null)
oc.DeleteObject(deleteImage);
oc.SaveChanges();
dataContext.TBL_TARGET.Remove(target);
TargetEditForm.UpdateTargetSession(target, 1);
trans.Commit();
return dataContext.SaveChanges();
}
catch
{
trans.Rollback();
return 0;
}
}
}
}
The following code when fails on trans.Commit();. It goes in catch block for executing trans.Rollback. Here it throws exception Underlying data cannot be rollback. On debug i found that trans.Connection is null. What is correct way to rollback from here ..
The trans.Rollback on the catch is not necessary, because the transaction is inside
using. When Disposable() from transaction is called, it does automatically a rollback.