【问题标题】:Using a transaction to Roll Back Changes with the Entity Framework通过实体框架使用事务回滚更改
【发布时间】:2012-11-06 08:10:37
【问题描述】:

我有这个从通用 DAO 继承方法的特定 DAO 我想在此代码中添加一个事务,以便在发现异常时回滚所有更改

        TDAO tDAO = new TDAO();
        TDAO2 tDAO2 = new TDAO2();


        //Get the DAO to delete from the database let's call them dDao and dDao2

        //Start the Transaction
        using (TransactionScope trans = new TransactionScope())
        {
            try
            {
                //Delete all SGC Associated switch
                TDAO2.Delete(dDao);

                //Delete switch
                TDAO.Delete(dDao2);

                //send notification
                base.SendChangeNotification();

                //Commit the Information Completing the Transaction
                trans.Complete();
            }
            catch (UpdateException ex)//SQL exception
            {
                //Log the error
                //Rollback the changes if there is an exception
                throw new Exception(Resources.ErrorMessages.OperationNotPermited);
            }
            catch (Exception ex) //Other exception
            {
                //Log the error
                throw new Exception(Resources.ErrorMessages.UndifenedError);
            }
        }

在 Visual Studio 中,转到项目中的“引用”图标。右键单击,添加引用。然后搜索 System.Transactions.dll。选择它,单击确定。然后尝试重建您的项目。还要确保顶部有 Using 语句 (C#) 或 Imports 语句 (VB),例如 Using System.Transactions;

并且更改在代码中。谢谢你

【问题讨论】:

  • 你想回滚什么?更改数据库?或更改数据上下文?对于数据库的更改 - 只需使用常规数据库事务。对于数据上下文的更改 - 不要:将其丢弃
  • 我想回滚对 DB 的更改。我该怎么做?
  • 哦,只是为了补充信息,数据库管理系统是 SQL Server 2008
  • 我认为最好留下原始问题并将您的解决方案添加为下面的答案。然后接受你的回答是正确的。它将问题标记为已回答,其他用户将看到问题和解决方案。
  • 用户,您以错误的方式使用 StackOverflow。问题应保持为问题,答案应作为答案提供。

标签: c# entity-framework-4 transactions dao data-access


【解决方案1】:

您需要完成事务,否则事务将被回滚。因此,在您的代码中您需要添加 Transaction.Complete() 方法,否则它会自行回滚。

【讨论】:

    【解决方案2】:

    虽然您将此标记为已解决,但仍然是一个答案。

    如果您使用实体框架,则不必担心事务。上下文管理工作单元并确保它在一个事务中提交(或回滚)。您的代码包含太多低级数据访问内容。让 EF 执行您的 CRUD 操作。

    Entity Framework 允许您在代码的大部分部分中无知。我的观点是:你不需要 DAO 模式。更糟糕的是:它只会妨碍你。它首先将数据库操作和上下文实例分开,然后您必须通过事务范围将它们放在一起。这意味着:您正在管理工作单元。与 POCO 合作,而不是与 DAO 合作。让一个上下文实例跟踪更改并通过一次SaveChanges() 调用保存它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多