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

回答

相关问题