使用事务使用实体框架回滚更改

时间:2012-11-06 08:10:37

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

我有这个特定的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;

更改在代码中。谢谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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