Erratic LINQ to SQL erreur: « opération ne peut être réalisée au cours d'un appel à SubmitChanges. »

StackOverflow https://stackoverflow.com/questions/4075367

Question

Ok, donc je reçois cette erreur des lignes:

  System.Data.Linq.DataContext.CheckNotInSubmitChanges() +42
  System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +54

Ce que je fais dépiste l'état et la connexion à chaque demande d'une application. L'application rend la production en JSON, et Html Xml.

La chose est l'erreur est erratique. Il ne se produit que tous les quelques demandes. L'erreur commencé à se produire quand je commencé à faire des demandes Ajax. Je suis en mesure de déterminer que l'erreur se produit plus fréquemment des demandes rapides (à savoir si je clique sur un lien à plusieurs reprises).

Je crée une instance distincte de l'DataContext chaque fois que j'appelle le service qui jette l'erreur. J'ai un temps vraiment difficile de déterminer ce la question est là, et je voudrais vraiment apprécier toute orientation et / ou explication quant à ce qui se passe. Merci.

* EDIT: **

 [InvalidOperationException: The operation cannot be performed during a call to SubmitChanges.]
    System.Data.Linq.DataContext.CheckNotInSubmitChanges() +80
    System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +73
    Magic.Model.Sessions.SqlXmlSessionStore.SubmitChanges() in SqlXmlSessionStore.cs:17
    Magic.Model.Sessions.SqlXmlSessionStore.UpdateSession(Session session) in SqlXmlSessionStore.cs:64
    Magic.Web.SessionService.OpenSession(MagicRequestContext requestContext) in SessionService.cs:36
    Magic.Web.SessionService.Magic.Model.Sessions.ISessionService.OpenSession(IRequestContext requestContext) in SessionService.cs:23

Les méthodes mentionnées sont:

private bool SubmitChanges()
{
   _sqlContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
   return _sqlContext.ChangeConflicts.Count == 0;   
}

public bool UpdateSession(Session session)
{
   var record = _sqlContext.SessionRecords.Single(x => x.SessionId == session.Key);
   _converter.PopulateRecordData(session, record);
   return SubmitChanges();
}

Toute la classe de service de session n'est SqlXmlSessionStore.UpdateSession d'appel (session) si la session est dans la db et active, ou SqlXmlSessionStore.InsertSession (session) si la demande est nouveau et l'identifiant de session est manquant ou unique.

J'ai essayé de créer une nouvelle instance de la DataContext chaque fois que je l'ai fait un SubmitChanges (), mais qui ont donné lieu en moi de ne pas avoir un objet de connexion, même quand je tire la même Conn. chaîne de paramètres. ce soit quelque chose pourrait avoir à faire avec ma machine locale?

Ok, donc je l'ai fait quelque chose qui fonctionne, mais je ne sais pas s'il y aura un problème avec ce que je ne suis pas Prévoyant.

Je ne le permet DataContext de soumettre une fois. J'accompli en modifiant le Code SubmitChanges () à:

    private bool _canSubmit = true;

    bool SubmitChanges(){
        if(_canSubmit)
        {
            _sqlContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
            _canSubmit = false;
            return _sqlContext.ChangeConflicts.Count == 0;      
        }
        return false;
     }

Cela semble encore comme un moyen très très hacky pour que cela fonctionne, et je voudrais aller au fond du problème, merci de conseiller si quelqu'un a une idée de comment résoudre ce problème.

Était-ce utile?

La solution 2

Il y aurait eu aucun moyen de savoir ce de mon poste, mais je trouve le problème. Configurer l'injection de dépendance dans une HttpModule, et il y avait un verrou sur la fonction de configuration. Je pense qu'il était là de vieux je code copié (et oublié) de quelque part quand je suis d'abord apprendre à utiliser StructureMap. J'ai enlevé la serrure et cela a fonctionné. (Bien, au moins il a commencé à produire de nouvelles erreurs non liées).

Oh, et la raison pour laquelle il affectait mon DataContext était parce que les classes qui enveloppaient les instances du DataContext étaient à l'intérieur de la serrure.

Autres conseils

Vous ne pouvez pas changer le jeu de changement à l'intérieur de SubmitChanges et vous ne pouvez pas appeler SubmitChanges dans les méthodes redéfinies des classes partielles. Je suppose que vous faites cela, mais je ne suis pas complètement vos fragments de code.

EDIT

Je ne comprends pas comment la durée de vie du DataContext est géré. Dans la première partie de la question que vous dites

  

Je crée une instance distincte de   DataContext chaque fois que je l'appelle   Service

mais dans la deuxième partie que vous dites

  

J'ai essayé de créer une nouvelle instance de la   DataContext chaque fois que je faisais une   (SubmitChanges), mais qui a abouti à   moi de ne pas avoir un objet de connexion

La prochaine chose que je ne comprends pas comment votre méthode modifiée qui appelle SubmitChanges une seule fois des œuvres, car il supprime toutes les modifications apportées aux données après le premier appel de ce qu'il doit soit être pas vous connecter toutes vos données ou tout appel après le premier appel à soumettre les modifications ne sont pas nécessaires.

Les méthodes d'instance du DataContext sont pas thread-safe, vous ne pouvez pas le mettre dans une variable globale au démarrage de l'application (tu fais ça?); vous voulez généralement un nouveau DataContext pour chaque requête HTTP, que vous pouvez faire en utilisant un cadre de contrôle de l'inversion ou tout simplement dans le code, la nouvelle dataconext au début de la demande et l'appel soumettre les modifications à la fin.

Une autre technique consiste à utiliser plusieurs DataContexts, créez le datacontext, apportez les modifications, composez le soumettre chnages, jetez-le DataContext, il est très léger. Vous ne souvent pas besoin d'appeler soumettre des changements plus d'une fois, la seule fois où je l'ai fait est de contrôler l'ordre d'exécution des instructions SQL.

Il serait bien si vous pouviez construire un exemple minimal et afficher le code entier.

Je vous suggère de joindre un débogueur et attrapez l'exception dans la loi. De là, vous devriez être en mesure de retracer où il vient.

Vous pouvez également override SubmitChanges et connectez-le stacktrace sur appel jamais pour traquer l'original de l'erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top