[英]Database.BeginTransaction() Entity framework rollback throws exception
I am using EF6
in my asp.net application. 我在我的asp.net应用程序中使用
EF6
。 In some code block i am using Transaction Scope
. 在某些代码块中,我正在使用
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();
trans.Commit();
失败时的以下代码trans.Commit();
. 。 It goes in
catch
block for executing trans.Rollback
. 它进入
catch
块以执行trans.Rollback
。 Here it throws exception Underlying data cannot be rollback
. 这里抛出异常
Underlying data cannot be rollback
。 On debug i found that trans.Connection
is null
. 在调试时我发现
trans.Connection
为null
。 What is correct way to rollback from here .. 什么是从这里回滚的正确方法..
The trans.Rollback on the catch is not necessary, because the transaction is inside using
. catch上的trans.Rollback不是必需的,因为事务处于内部
using
。 When Disposable() from transaction is called, it does automatically a rollback. 当调用事务中的Disposable()时,它会自动进行回滚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.