C#LINQ状态DeleteOnSubmit()

时间:2009-03-27 14:21:24

标签: c# .net linq linq-to-sql

我正在开发一项网络服务,用于创建,更改和删除酒店预订(预订)。一个预订可以包含多个住宿(住宿是房间之间的链接,订购的服务等)。每次入住都有自己的时间段,因此您可以在同一预订中创建3次住宿,为期3周。

当需要更改预订时,我的问题就出现了。输入是预订ID(如上所示)以及所需住宿的新数据。因此,如果原来的住宿是2个单人间和1个双人间,每个都有自己的开始和结束日期,并且客户希望将其中一个单人间改为双人间,他会发送:1个单人间,2个双人间,以及由我来决定改变了什么(这不会改变,所以我担心任何解决方案都会改变这种情况。)

我使用LINQ来挑选当前的停留并将其设置为删除

var oldStays = (from stay in persistentStorage.DataContext.Stays 
                where stays.booking_id == bookingId 
                select stay);
persistentStorage.DataContext.Stays.DeleteAllOnSubmit(oldStays);

然而,在我删除它们之前,我需要确保有新的住宿空间。如果LINQ在进行新查询时自动将这些记录假设为已删除(这意味着我不必担心日期,现有房间等),这将是一个简单的方法。如果是这种情况,问题就已经解决了。

如果没有,我需要某种方式来检查新的可用预订,同时忽略没有改变的住宿(在上述情况下,我只需要检查在给定时间段内是否有双人房,因为另一个双人和单人已经预订了)。有没有一些聪明的方法LINQ可以在这方面提供帮助,如果有,怎么做?

1 个答案:

答案 0 :(得分:5)

您应该能够通过使用交易获得预期的行为:

  • 创建交易
  • 删除您的预订
  • 检查新房间是否可用并预订
  • 如果一切正常,请提交
  • 否则回滚交易

编辑 - 示例(使用SQL事务,您也可以使用TransactionContext):

try
{
  persistentStorage.DataContext.Transaction=persistentStorage.DataContext.Connection.BeginTransaction();

  var oldStays = (from stay in persistentStorage.DataContext.Stays 
                where stays.booking_id == bookingId 
                select stay);
  persistentStorage.DataContext.Stays.DeleteAllOnSubmit(oldStays);
  persistentStorage.DataContext.SubmitChanges();

  // do you select/insert/etc.

  if (ok)
    persistentStorage.DataContext.Transaction.Commit();
}
finally
{
  if (persistentStorage.DataContext.Transaction!=null) persistentStorage.DataContext.Transaction.Dispose();
  persistentStorage.DataContext.Transaction=null;
}