2010-02-12 5 views
0

J'ai un assistant RESTful modifié basé sur Shoulders of Giants | A RESTful Wizard Using ASP.Net MVC… Perhaps?. Cet assistant a un bouton CANCEL qui, lorsqu'il est pressé, déclenche le code ci-dessous.Application de la suppression de l'entrée ObjectStateManager à la fin de la page

// If the user cancels, drop out altogether 
if (!string.IsNullOrEmpty(CANCEL_BUTTON)) { 
    Session.Remove(VACANCYWIZARD_SESSION_KEY); 
    repository._entities.ObjectStateManager.GetObjectStateEntry(inProgressVacancyWizard.Vacancy).Delete(); 
    return this.RedirectToAction("Index", "Home"); 
} 

Maintenant, pour être en mesure d'appeler SaveChanges() après le bouton Annuler Je dois supprimer manuellement l'entrée de l'assistant de mon ObjectStateManager. Mais lorsque vous annulez l'assistant en revenant manuellement à la page d'accueil, il reste dans et un prochain appel à _entities.SaveChanges() lèvera une exception qu'il ne peut pas enregistrer l'objet, à partir de la progression de l'assistant vers la base de données, car il est toujours dans l'état de l'objet.

Notez que, entre les étapes de l'assistant, je fais et non enregistrer n'importe quoi dans la base de données. Je garde dans l'état de session le récupérer chaque étape:

NewVacancy inProgressVacancyWizard = Session[VACANCYWIZARD_SESSION_KEY] as NewVacancy; 

D'une certaine manière, cependant, le inProgressVacancyWizard.Vacancy apparaît dans le ObjectStateManager donc je dois le supprimer sinon je des erreurs concernant incomplètes les offres modèles tandis que le _entities.SaveChanges() est appelée pour un autre objet.

Existe-t-il un moyen de couvrir ce problème? Après quelques lectures, j'ai découvert que les fondements de mon référentiel ne sont pas bons. Trouvé here. Actuellement, je doute de mettre en œuvre l'option mentionnée dans "Une instance ObjectContext par transaction commerciale" dans le même article. Serait-ce une chose sage? J'aimerais en savoir plus à ce sujet, car ce sera un refactor majeur.

public static Repository Instance 
    { 
     get 
     { 
      if (instance == null) { 
       instance = new Repository(); 
      } 
      return instance; 
     } 
    } 

#region Constructor: Repository() 
    /// <summary> 
    /// Constructor 
    /// </summary> 
    private Repository() 
    { 
     _entities = new DBModelEntitiesNew2(); 

    } 

Répondre

1

Il semble que vous utilisez une seule instance ObjectContext sur plusieurs demandes. Ne fais pas ça. Cela ne vous causera que de la misère. Cela rend votre serveur web dynamique. Disposez le ObjectContext après le rendu de la réponse (nous le faisons, indirectement, à partir de Controller.Dispose), et créez un nouveau pour la prochaine requête.

+0

Merci pour la réponse, c'est effectivement le problème. Bien que la commutation des pages de mon assistant ne soit pas si simple. Ce sera la réponse finale car c'est correct. Bien que j'aimerais entendre des opinions sur les informations éditées. – bastijn

+0

Pourquoi faire du référentiel un singleton? Cela n'a aucun sens pour moi. Vous voulez que votre application Web soit apatride. –

Questions connexes