2009-03-27 10 views
2

Je travaille sur un service Web pour créer, modifier et supprimer des réservations d'hôtel (réservations). Une réservation peut contenir plusieurs séjours (un séjour est un lien entre une chambre, les services commandés, etc.). Chaque séjour a sa propre période de temps, de sorte que vous pouvez créer 3 séjours dans la même réservation, pour 3 semaines différentes.C# LINQ État de DeleteOnSubmit()

Mon problème se pose lorsque les réservations doivent être modifiées. L'entrée est l'identifiant de réservation (comme vu ci-dessus) ainsi que les nouvelles données sur les séjours souhaités. Donc, si les séjours d'origine étaient 2 chambres individuelles et 1 chambre double, chacune avec leurs propres dates de début et de fin, et le client a souhaité changer une des chambres simples à une chambre double, il enverrait: 1 simple, 2 doubles, et c'est à moi de comprendre ce qui a changé (cela ne va pas changer, donc je crains que toutes les solutions suggérant de changer ceci soient sorties).

J'utilise LINQ pour choisir les séjours actuels et les fixer pour la suppression

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

Avant que je puisse les supprimer, mais, je dois vous assurer qu'il ya des chambres disponibles pour les nouveaux séjours. Une solution de facilité serait que LINQ considère automatiquement ces enregistrements comme supprimés lors de nouvelles requêtes (ce qui signifie que je n'aurais pas à me soucier des dates, des salles existantes, etc.). Si tel est le cas, le problème est déjà résolu. Sinon, j'ai besoin d'un moyen de vérifier les nouvelles réservations disponibles tout en ignorant les séjours qui n'ont pas changé (dans le cas ci-dessus, je voudrais seulement vérifier si une chambre double était disponible dans la période donnée , puisque l'autre double et single sont déjà réservés). Y a-t-il une manière intelligente dont LINQ peut aider à cela, et si oui, comment?

Répondre

5

Vous devriez être en mesure d'obtenir le comportement souhaité en utilisant les transactions:

  • créer une transaction
  • supprimer vos réservations
  • vérifier si les nouvelles chambres sont disponibles et les réserver
  • si tout est correct, validez
  • sinon annulez la transaction

EDIT - Exemple (en utilisant la transaction SQL, vous pouvez également utiliser un 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; 
} 
+0

Une partie de ma question était, comment puis-je le fais à travers LINQ to SQL? Et j'ai lu quelque part que SubmitChanges fait tout rouler dans une transaction, mais est-ce que les requêtes de suppression non validées sont prises en compte lors de certaines requêtes select? –

+0

Si vous ne définissez pas une transaction, vous obtiendrez une implicite, mais si vous définissez le TransactionScope vous-même, vous avez le contrôle sur la transaction et SubmitChanges ne la validera pas pour vous. – laktak