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()内部我们正在执行其他数据库事务,比如获取税务信息等等。我假设由于员工姓名的更新在异常之前已经提交,这意味着它会被传播到数据库,对吧? –