C # LINQ Состояние DeleteOnSubmit () - PullRequest
2 голосов
/ 27 марта 2009

Я работаю над веб-сервисом для создания, изменения и удаления бронирований в отелях (бронирования). Одно бронирование может содержать несколько пребываний (пребывание - это связь между номером, заказанными услугами и т. Д.). Каждое пребывание имеет свой период времени, поэтому вы можете создать 3 пребывания в одном бронировании на 3 разные недели.

Моя проблема возникает, когда необходимо изменить бронирование. Входными данными являются идентификатор бронирования (как показано выше), а также новые данные о желаемом пребывании. Таким образом, если первоначальное проживание составляло 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 Ответ

5 голосов
/ 27 марта 2009

Вы должны быть в состоянии получить намеченное поведение, используя транзакции:

  • создать транзакцию
  • удалить ваши заказы
  • проверьте наличие новых номеров и забронируйте их
  • если все в порядке, передайте
  • в противном случае откат транзакции

EDIT - Пример (используя транзакцию 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...