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()執行的更改仍會傳播到數據庫嗎?
請提供[mcve]。具體來說,SaveChanges()和ComputeSalary()是做什麼的?你在哪裏開始和提交交易? –
'useOfWork' *實例*將在'using'塊結束時處理,而不管* how *如何。數據庫發生的事情完全取決於'UnitOfWork'的實現,以及數據庫如何處理事務。 'UnitOfWork'不是一個.NET框架類,所以沒有上下文很難說清楚。 –
@ Code-Apprentice:unitOfWork下的SaveChanges()也是實體框架中的DataContext.SaveChanges(),所以這是事務提交的地方。我只是在unitOfWork中封裝了DataContext.SaveChanges()以將應用程序與持久性框架分離。作爲一個例子,我們只是說在ComputeSalary()內部我們正在執行其他數據庫事務,比如獲取稅務信息等等。我假設由於員工姓名的更新在異常之前已經提交,這意味着它會被傳播到數據庫,對吧? –