我想让父对象在单个事务范围内删除自身及其子对象。我还想在这两种情况下检查要删除的对象是否存在,以及用户是否有权访问该对象。考虑以下代码:
我收到服务器上的 MSDTC 不可用异常。无论如何通过我的服务方法传递连接?
请看下面的例子:
//类 Flight, FlightService, FlightDao //类 Pilot、PilotService、PilotDao
// FlightService
public void deleteFlight(Flight flight) {
FlightDao flightDao = new FlightDao();
Flight existingFlight = flightDao.findById(flight.Id);
if (existingFlight != null) {
using (TransactionScope scope = new TransactionScope()) {
try {
PilotService.Instance.deletePilot(flight.Pilot);
flightDao.delete(flight);
} catch (Exception e) {
log.Error(e.Message, e);
throw new ServiceException(e.Message, e);
}
scope.Complete();
}
}
}
// PilotService
public void deleteFlight(Pilot pilot) {
PilotDao pilotDao = new PilotDao();
Pilot existingPilot = pilotDao.findById(pilot.Id); // THIS LINE RIGHT HERE THROWS EXCEPTION
if (existingPilot != null) {
using (TransactionScope scope = new TransactionScope()) {
try {
pilotDao.delete(pilot);
} catch (Exception e) {
log.Error(e.Message, e);
throw new ServiceException(e.Message, e);
}
scope.Complete();
}
}
}
最佳答案
您在事务中使用了多个数据上下文层。您需要将一个传递给另一个。 “deletePilot”调用应在同一数据上下文中执行。一种解决方案是让数据访问层的构造函数接受来自另一个数据服务的数据上下文。他们将在相同的上下文中执行操作。
public void deleteFlight(IYourDataContext context, Pilot pilot) {
PilotDao pilotDao = new PilotDao(context);
//do operations now in same context.
...
关于C# Transactionscope - 在同一事务中插入/选择,多个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10567558/