2017-08-24 20 views
0

請考慮下面的代碼:如果發生異常,將保存更改嗎?

public class UnitOfWork 
{ 
    private readonly Context _context; 
    public IEmployeeRepository Employees { get; private set; } 

    public UnitOfWork(Context context) 
    { 
     _context = context; 
     Employees = new EmployeeRepository(_context); 
    } 

    public int SaveChanges() 
    { 
     return _context.SaveChanges(); 
    } 
} 

public class Program 
{ 
    try 
    { 
     using (var unitOfWork = new UnitOfWork(new Context())) 
     { 
      var employee = unitOfWork.Employees.GetById(1); 
      employee.Name = "John"; 
      unitOfWork.SaveChanges(); 

      ComputeSalary(employee); 
     } 
    } 

    catch (Exception ex) 
    { 
     // Exception logic goes here... 
    } 

    private void ComputeSalary(Employee employee) 
    { 
     int x = 1/0; // This will throw an exception. 

     return; 
    } 
} 

Context類從實體框架DbContext繼承。因此,在ComputeSalary()函數中,您將看到由於不允許除零而引發異常。這將導致代碼退出使用塊,從而處理unitOfWork。我的問題是,即使ComputeSalary()函數發生異常,由SaveChanges()執行的更改仍會傳播到數據庫嗎?

+0

請提供[mcve]。具體來說,SaveChanges()和ComputeSalary()是做什麼的?你在哪裏開始和提交交易? –

+3

'useOfWork' *實例*將在'using'塊結束時處理,而不管* how *如何。數據庫發生的事情完全取決於'UnitOfWork'的實現,以及數據庫如何處理事務。 'UnitOfWork'不是一個.NET框架類,所以沒有上下文很難說清楚。 –

+0

@ Code-Apprentice:unitOfWork下的SaveChanges()也是實體框架中的DataContext.SaveChanges(),所以這是事務提交的地方。我只是在unitOfWork中封裝了DataContext.SaveChanges()以將應用程序與持久性框架分離。作爲一個例子,我們只是說在ComputeSalary()內部我們正在執行其他數據庫事務,比如獲取稅務信息等等。我假設由於員工姓名的更新在異常之前已經提交,這意味着它會被傳播到數據庫,對吧? –

回答

相關問題