【问题标题】:Database.BeginTransaction() Entity framework rollback throws exceptionDatabase.BeginTransaction() 实体框架回滚抛出异常
【发布时间】: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.Connectionnull。从这里回滚的正确方法是什么..

【问题讨论】:

  • 在回滚异常前捕获原始异常消息,并发布。
  • 异常是由于在删除主表之前外键引用保留在某些表中
  • 我知道问题所在,但我的问题是,如果 try 块中抛出异常,那么为什么它不在 catch 块中回滚。为什么 trans.connection 在 catch 块中设置为 null
  • 老实说,我不会返回并在同一行致电SaveChanges,我会这样做var result = dataContext.SaveChanges(); trans.Commit(); return result;。这让保存在事务中。

标签: c# asp.net entity-framework transactionscope


【解决方案1】:

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

【讨论】:

  • 真的吗!!!但就我而言,它不是回滚。可能是因为我使用 OjbectContext 从引用表中删除行?在我的情况下可能是什么解决方案
  • 抱歉,我从来没有直接使用过 ObjectContext。但对我来说这没有意义,DataContext 只是 ObjectContext 的一个包装器,从逻辑上讲,它们似乎必须共享相同的连接和事务范围。如果我是你,我会检查这两个对象是否共享同一个数据库连接
  • @MarcCals,在这种情况下,是否需要使用 try-catch 语句?由于在捕获时我只调用 transaction.Rollback() 并重新抛出异常。
猜你喜欢
  • 2012-10-20
  • 2014-04-28
  • 1970-01-01
  • 2014-10-16
  • 2023-03-15
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多