我有这个特定的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;
更改在代码中。谢谢
答案 0 :(得分:0)
您需要完成交易,否则交易将回滚。因此,在您的代码中,您需要添加Transaction.Complete()方法,否则它将自行回滚。
答案 1 :(得分:0)
虽然您将此标记为已解决,但仍然是答案。
如果您使用Entity Framework,则不必担心交易。上下文管理工作单元并确保它在一个事务中提交(或回滚)。您的代码包含太多的低级数据访问内容。让EF做你的CRUD动作。
实体框架允许您在代码的大部分内容中持久性无知。我的观点是:你不需要DAO模式。更糟糕的是:它只会妨碍它。它首先分离数据库操作和上下文实例,然后您必须通过事务范围将它们全部放在一起。这意味着:您正在管理工作单元。与POCO合作,而不是与DAO合作。让一个上下文实例跟踪更改并通过一次SaveChanges()
调用保存它们。