2009-02-27 4 views
1

J'ai créé une méthode d'extensibilité pour supprimer un de mes objets Linq To Sql appelé Reservation.LINQ to SQL - Mise à jour des objets de contexte de données dans des classes partielles

Eh bien, dans cette méthode partielle que j'ai créée, je veux mettre à jour d'autres objets. Je ne peux pas sembler obtenir la mise à jour pour être persisté dans la base de données. Voici ma méthode partielle pour supprimer la réservation.

public partial class LawEnforcementDataContext 
{ 

    partial void DeleteReservation(Reservation instance) 
    { 
     // Get ID's of those seated in course 
     var roster = new Roster(this, instance.CourseID); 
     var seated = from r in roster.All 
        where r.WaitingList == false 
        select r.ID; 

     // delete the reservation 
     this.ExecuteDynamicDelete(instance); 

     // get seated id's not in original seated ids 
     var newlySeated = from r in roster.All 
          where r.WaitingList == false && !seated.Contains(r.ID) 
          select r.ID; 

     var reservations = this.Reservations.Where(r => newlySeated.Contains(r.ID)); 

     foreach (var r in reservations) 
     { 
      r.Confirmed = false; 
      // Have tried doing nothing, thinking calling code's db.SubmitChanges() would do the trick 
      //this.ExecuteDynamicUpdate(r); HAVE TRIED THIS 
     } 
     //this.SubmitChanges(); HAVE TRIED THIS 
    } 
} 

La suppression a lieu mais la mise à jour ne l'est pas. Commenté dans les dernières lignes sont certaines des choses que j'ai essayé.

Des idées? Merci!

EDIT

Voici ce que je l'ai fait pour résoudre ce:

public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode) 
{ 
    ChangeSet delta = GetChangeSet(); 

    foreach (var res in delta.Deletes.OfType<Reservation>()) 
    { 
     // Get ID's of those seated in course 
     var roster = new Roster(this, res.CourseID); 
     var seated = from r in roster.All 
        where r.WaitingList == false 
        select r.ID; 

     base.SubmitChanges(failureMode); 

     // get seated id's not in original seated ids 
     var newlySeated = from r in roster.All 
          where r.WaitingList == false && !seated.Contains(r.ID) 
          select r.ID; 

     var reservations = this.Reservations.Where(r => newlySeated.Contains(r.ID)); 

     foreach (var r in reservations) 
     { 
      r.Confirmed = false; 
     } 
    } 

    base.SubmitChanges(failureMode); 
} 

Répondre

5

Je pense que le problème ici est qu'il a déjà appelé GetChangeSet().

Je vous suggère de passer outre SubmitChanges() au contexte des données, et d'appliquer cette logique là à la place ...

partial class LawEnforcementDataContext 
{ 
    public override void SubmitChanges(
     System.Data.Linq.ConflictMode failureMode) 
    { 
     ChangeSet delta = GetChangeSet(); 
     foreach (var reservation in delta.Deletes.OfType<Reservation>()) 
     { 
      // etc 
     } 
     base.SubmitChanges(failureMode); 
    } 
} 
+0

J'ai besoin que la suppression de la réservation ait lieu dans la boucle foreach. Est-ce que je dois encore appeler GetChangeSet() après avoir fait la suppression? –

+1

Si vous le supprimez simplement logiquement, il devrait être supprimé lors de l'appel de base.SubmitChanges(); Fondamentalement, SubmitChanges appelle GetChangeSet en interne, et il devrait maintenant avoir quelques suppressions supplémentaires à faire ... –

+0

Si cela ne suffit pas ... hmmm ... ne sais pas. –

Questions connexes