【发布时间】:2015-06-11 11:57:48
【问题描述】:
我在我的 asp.net 应用程序中使用EF6。在某些代码块中,我使用Transaction Scope。以下是我的代码
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;
}
}
}
}
trans.Commit(); 失败时的以下代码。它进入catch 块以执行trans.Rollback。在这里它抛出异常Underlying data cannot be rollback。在调试时我发现trans.Connection 是null。从这里回滚的正确方法是什么..
【问题讨论】:
-
在回滚异常前捕获原始异常消息,并发布。
-
异常是由于在删除主表之前外键引用保留在某些表中
-
我知道问题所在,但我的问题是,如果 try 块中抛出异常,那么为什么它不在 catch 块中回滚。为什么
trans.connection在 catch 块中设置为 null -
老实说,我不会返回并在同一行致电
SaveChanges,我会这样做var result = dataContext.SaveChanges(); trans.Commit(); return result;。这让保存在事务中。
标签: c# asp.net entity-framework transactionscope