2012-11-06 54 views
0

我有這個特定的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中,轉到項目中的References圖標。右鍵單擊添加引用。然後搜索System.Transactions.dll。選擇它,點擊確定。然後嘗試重建您的項目。還要確保你在頂部有一個Using語句(C#)或Imports語句(VB),就像使用System.Transactions;

而變化在代碼中。謝謝

+1

你想要回滾的是什麼?對數據庫的更改?或更改數據上下文?對於數據庫的更改 - 只需使用常規數據庫事務。對於數據上下文的更改 - 不要:只是*扔掉它*。 –

+0

我想回滾對數據庫的更改。我怎樣才能做到這一點 ? – rjcossa

+0

哦,只是爲了獲取更多信息,數據庫管理系統是SQL Server 2008 – rjcossa

回答

0

您需要完成交易,否則交易將回滾。所以,在你的代碼中你需要添加Transaction.Complete()方法,如果你不這樣做,它會自動回滾。

0

雖然您將此標記爲已解決,但仍然是答案。

如果你使用實體框架,你不應該擔心事務。上下文管理工作單元,並且看到它在一次事務中承諾(或回滾)。您的代碼包含太多低級別的數據訪問內容。讓EF執行您的CRUD操作。

實體框架允許您在代碼的大部分區域成爲持久性無知的。我的意見是:你不需要DAO模式。更糟的是:它只能阻礙你。它首先分離數據庫操作和上下文實例,然後您必須將它們放在一起進行事務處理。這意味着:您正在管理工作單元。與POCO合作,而不是與DAO合作。讓一個上下文實例跟蹤更改並將其保存一個SaveChanges()調用。