Database.BeginTransaction()实体框架回滚抛出异常

Raj*_*mar 1 c# asp.net entity-framework transactionscope

我正在EF6我的 asp.net 应用程序中使用。在我正在使用的某些代码块中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;
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

以下代码在 上失败时trans.Commit();。它进入catch块执行trans.Rollback。这里它抛出异常Underlying data cannot be rollback。在调试时我发现trans.Connectionnull。从这里回滚的正确方法是什么..

Mar*_*als 5

catch 上的 trans.Rollback 不是必需的,因为事务位于 内部using。当调用事务中的 Disposable() 时,它会自动回滚。