2010-01-18 7 views
6

J'ai récemment reçu un rapport d'erreur d'un client et je n'ai aucune chance de le résoudre. J'espère que quelqu'un pourra me donner un aperçu de ce qui pourrait être mauvais.Erreur lors de la suppression d'un enregistrement à l'aide de Linq2SQL

L'erreur semble assez simple:

Csla.DataPortalException: DataPortal.Delete a échoué (System.InvalidOperationException: séquence contient plus d'un élément à System.Linq.Enumerable.SingleOrDefault [TSource] (source IEnumerable`1)

Voici ma méthode de DataPortal_Delete, qui prend la FileId (PK) en tant que paramètre.

private void DataPortal_Delete(SingleCriteria<File, Guid> criteria) 
    { 
     using (var ctx = ContextManager<Ronin.Data.RoninDataContext> 
        .GetManager(Database.ApplicationConnection, false)) 
     { 
      var data = ctx.DataContext.Files 
        .Single(row => row.FileId == criteria.Value); 

      ctx.DataContext.FileSources.DeleteAllOnSubmit(data.FileSources); 

      ctx.DataContext.Files.DeleteOnSubmit(data); 

      ctx.DataContext.SubmitChanges(); 
     } 
    } 

la première chose que je vérifie était de voir s'il y avait un autre enregistrement du même FileId (bien être la prima clé ry, cela devrait être impossible). Tous les fichiers étaient en fait uniques. J'ai lancé l'application se connectant à la base de données client et j'ai essayé de supprimer l'enregistrement et cela a fonctionné sans aucun problème. Le responsable informatique du site client a utilisé le "Problem Step Recorder" pour m'envoyer des captures d'écran des actions prises par l'utilisateur. Rien d'extraordinaire, et quand il a utilisé une machine différente, il a pu effacer le dossier sans aucune erreur. Apparemment, cela ne se produit que lorsque l'application est exécutée dans Windows 7.

Cela dit, des idées sur ce qui pourrait être à l'origine de cela?

+0

Files.FileId est la clé primaire sur cette table? –

+0

Etes-vous sûr que l'erreur est générée par cet extrait de code? L'erreur fait référence à SingleOrDefault, mais la fonction utilise Single. – gfrizzle

+0

Les fichiers sont-ils Nuls? Si ce sont des objets différents, ne devez-vous pas utiliser un include pour les obtenir avant de pouvoir les supprimer? – awright18

Répondre

1

En supposant que l'appel à l'unité est la source du problème, au lieu de:

ctx.DataContext.Files.Single(...) 

changer le code pour permettre le retour de plusieurs lignes de cette requête, puis connectez-vous ce qu'il est de retour quand il retourne plus une rangée. Cela devrait vous diriger vers votre problème de données "en double".

Une autre chose à regarder est le SQL qui est généré dans les coulisses. Pas sûr que ça va aider, mais ça ne peut pas faire de mal. Je ne connais pas votre modèle de données, donc je ne peux pas comprendre votre code aussi bien que je le voudrais.

+0

Le message d'exception est assez clair; Single renforce le fait qu'une seule ligne sera retournée. Deux ou plus mènera à l'exception. Je ne changerais pas le code cependant; une simple instruction sql trouvera la dupe: 'select fileid, count (*) du groupe Files par fileid ayant count (*)> 1' – Andy

0

Si cela se produit uniquement dans Windows 7, cela peut être dû au système d'exploitation. L'avez-vous essayé sur Vista? L'environnement de Vista est simmilar sur Windows 7. Vous pouvez également utiliser Windows Virtual PC + XP Mode. Il s'agit d'une application de virtualisation spécialement conçue pour Windows 7 pour permettre aux utilisateurs d'exécuter des applications comme dans Windows XP. Remarque: Le mode XP nécessite un processeur compatible avec la virtualisation.

0

J'ai eu la même exception lors de la suppression une entité. Le problème s'est avéré être une relation de clé étrangère définie dans le fichier dbml. Donc, c'était la raison de l'exception dans mon cas. Après avoir supprimé que cela a fonctionné pour supprimer l'enregistrement (et je ne voulais pas supprimer en cascade les enregistrements de l'autre table, j'ai juste besoin de savoir comment configurer linq-to-sql pour simplement définir la colonne de clé étrangère null)

Questions connexes